前后端分离的开发模式中,或者与第三方接口交互,需要规范接口响应,下面是我在开发中的封装的一组响应实体类
- 响应实体父类, 父类中需要一个code,因为不管是响应消息还是数据,都要有code
/**
- @title 响应实体父类
- @author gavin
- @date 2020年6月10日
*/
public class Response {
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
- 信息响应实体类,继承Response类,并且需要添加一个msg属性,用于存储返回码描述
/**
* @title 消息响应实体类
* @author gavin
* @date 2020年6月10日
*/
public class ResponseMsg extends Response {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
- 数据响应实体类,继承Response类,并且需要添加一个data属性,用来存储响应数据
/**
* @title 数据响应实体类
* @author gavin
* @date 2020年6月10日
*/
public class ResponseData extends Response{
private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
接下来就可以使用了,新建RspController测试一下响应错误信息和响应数据
@RestController
@RequestMapping("rsp")
public class RspController {
@GetMapping("msg")
public Response msg() {
ResponseMsg responseMsg = new ResponseMsg();
responseMsg.setCode("401");
responseMsg.setMsg("用户无权限");
return responseMsg;
}
@GetMapping("data")
public Response data() {
ResponseData responseData = new ResponseData();
responseData.setCode("0");
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "张三");
map.put("age", 24);
responseData.setData(map);
return responseData;
}
}
启动项目,使用postman访问一下
- 访问/rsp/msg接口,postman收到响应如下
- 访问/rsp/data接口,postman收到响应如下
开发中,返回码通常都是共用的,不需要每个接口都写一遍硬代码,我们可以对全局错误码封装一个枚举类
public enum ResponseEnum {
SUCCESS("0" , "ok"),
AUTH_DENIED("401","用户无权限");
private String code;
private String msg;
ResponseEnum(String code , String msg){
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
有了全局返回码枚举类后,/rsp/msg接口中就不要写硬代码了,可以改成如下
@GetMapping("msg")
public Response msg() {
ResponseMsg responseMsg = new ResponseMsg();
responseMsg.setCode(ResponseEnum.AUTH_DENIED.getCode());
responseMsg.setMsg(ResponseEnum.AUTH_DENIED.getMsg());
return responseMsg;
}
虽然这样避免了多处使用硬代码的问题,但还是有些繁琐,我们还可以编写一个ResponseUtil类,来简化开发
/**
* @title 响应工具类
* @author gavin
* @date 2020年6月11日
*/
public class ResponseUtil {
/**
* @title 成功返回码
* @author gavin
* @date 2020年6月11日
* @return
*/
public static Response success() {
ResponseMsg response = new ResponseMsg();
response.setCode(ResponseEnum.SUCCESS.getCode());
response.setMsg(ResponseEnum.SUCCESS.getMsg());
return response;
}
/**
* @title 通用返回码
* @author gavin
* @date 2020年6月11日
* @return
*/
public static Response rspMsg(String code , String msg) {
ResponseMsg response = new ResponseMsg();
response.setCode(code);
response.setMsg(msg);
return response;
}
/**
* @title 通用返回码
* @author gavin
* @date 2020年6月11日
* @return
*/
public static Response rspMsg(ResponseEnum responseEnum) {
ResponseMsg response = new ResponseMsg();
response.setCode(responseEnum.getCode());
response.setMsg(responseEnum.getMsg());
return response;
}
/**
* @title 响应数据
* @author gavin
* @date 2020年6月11日
* @param data
* @return
*/
public static Response rspData(Object data) {
ResponseData response = new ResponseData();
response.setCode(ResponseEnum.SUCCESS.getCode());
response.setData(data);
return response;
}
}
ResponseUtil类中封装了4个方法,基本上够我们日常开发使用了,接下来我们可以用这个工具类来简化一下/rsp/msg接口和/rsp/data接口,代码如下
@RestController
@RequestMapping("rsp")
public class RspController {
@GetMapping("msg")
public Response msg() {
return ResponseUtil.rspMsg(ResponseEnum.AUTH_DENIED);
}
@GetMapping("data")
public Response data() {
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "张三");
map.put("age", 24);
return ResponseUtil.rspData(map);
}
}
通过工具类简化后,基本上响应代码就只需要一行就可以了,大大简化了我们的代码。