在web的前后端分离开发过程中,前端发送请求给后端,后端接收请求,响应数据给前端
请求
前端发送数据进行请求
简单参数
原始方式
在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。
代码样例:
//原始方式@RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name=request.getParameter("name");String ageStr=request.getParameter("age");int age=Integer.parseInt(ageStr);System.out.println(name+":"+age);return "OK";}
前端测试发送的请求:
SpringBoot方式
简单参数:参数名与形参变量名相同,定义形参即可接收参数。
//方式1@RequestMapping("/simpleParam")public String simpleParam(String name,Integer age ){System.out.println(name+":"+age);return "OK";}
简单参数: 如果方法形参名称与请求参数名称不匹配,可以使用 @RequestParam 完成映射。
//方式2@RequestMapping("/simpleParam")//这里设置name不是必须传入参数public String simpleParam(@RequestParam(name="name" ,required = false) String username, Integer age ){System.out.println(username+":"+age);return "OK";}
注意:@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。
SpringBoot方式会自动进行类型转换,如上面的age
实体参数
简单实体对象
请求参数名与形参对象属性名相同,定义POJO接收即可
如果对象里面有另一个对象,方式如下:
两个对象如下:
public class User {private String name;private Integer age;private Address address;
}
public class Address {private String province;private String city;
}
get,set等其他方法已省略
接收方式还是不变如上
//2. 实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "OK";}
发送请求样例如下:
变化是多加了“点”进行访问
数组集合方式
数组参数
数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
集合参数
集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系
日期参数
日期参数:使用 @DateTimeFormat注解完成日期参数格式转换
JSON参数
响应
后端响应数据给前端
注意转换为JSON格式
代码样例:
//响应字符串@RequestMapping("/hello")public String hello(){System.out.println("Hello World ~");return "Hello World ~";}//响应对象@RequestMapping("/getAddr")public Address getAddr(){Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");return addr;}//响应集合@RequestMapping("/listAddr")public List<Address> listAddr(){List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");Address addr2 = new Address();addr2.setProvince("陕西");addr2.setCity("西安");list.add(addr);list.add(addr2);return list;}
运行后样例:
响应字符串:
{"code": 1,"msg": "success","data": "Hello World ~"
}
响应对象:
{"code": 1,"msg": "success","data": {"province": "广东","city": "深圳"}
}
响应集合:
{"code": 1,"msg": "success","data": [{"province": "广东","city": "深圳"},{"province": "陕西","city": "西安"}]
}
统一响应结果
好处就是只要返回result一个结果,提高代码复用性
代码样例
@RequestMapping("/hello")public Result hello(){System.out.println("Hello World ~");//return new Result(1,"success","Hello World ~");return Result.success("Hello World ~");}@RequestMapping("/getAddr")public Result getAddr(){Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");return Result.success(addr);}@RequestMapping("/listAddr")public Result listAddr(){List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("广东");addr.setCity("深圳");Address addr2 = new Address();addr2.setProvince("陕西");addr2.setCity("西安");list.add(addr);list.add(addr2);return Result.success(list);}
Result对象代码:
package com.ithema.pojo;/*** 统一响应结果封装类*/
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic Result() {}public Result(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success(Object data){return new Result(1, "success", data);}public static Result success(){return new Result(1, "success", null);}public static Result error(String msg){return new Result(0, msg, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}