在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; //数据 data
public 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);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}