SpringBoot统一返回体与统一请求体
YuWei Wu 1/26/2022 Java
项目中方便不同系统进行规范化的数据交互
# 需求背景
假设现在微信小程序需要调用我们系统的接口,其中它会给我们传来以下参数:
{
"sysId": "",
"transCode": "",
"transName": "",
"requestParams": {
"productName": "",
"productAddress": "",
"price": 100
}
}
它又需要以下返回值:
{
"rtnCode": "",
"rtnMessage": "",
"result": {
"evaluate": "",
"stars": 5
},
"success": true
}
# 需求分析
前端传来的是一个Json数据,那么我们可以使用FastJson中的JsonObject进行接收,解析后完成业务处理。再将返回值通过Map<key,value>进行包装进行返回。
但是这样做一是代码不够美观,二是会造成代码冗余。尤其是像requestParams这种里面参数不确定使得我们dto写起来很不舒服。
那么我们可以使用统一的请求体,返回体进行包装,使得代码变得优雅且更容易使用
# 实现
- 项目结构:
- controller:存放后端对外暴露接口
- dto:存放dto类
- template:存放统一返回体,统一请求体模板
- DemoApplication:SpringBoot启动类
- 统一请求体与返回体
package com.example.demo.template;
import jdk.jfr.Description;
import lombok.Data;
/**
* 微信支付请求体包装类
* @author wuyuwei
*/
@Data
public class WeChatRequestMessage<T> {
@Description("请求内容")
private T requestParams;
@Description("系统Id")
private String sysId;
@Description("交易代码")
private String transCode;
@Description("交易名称")
private String transName;
}
package com.example.demo.template;
import jdk.jfr.Description;
import lombok.Data;
/**
* 微信支付统一返回包装类
* @author wuyuwei
* @param <T>
*/
@Data
public class WeChatResponseMessage<T> {
@Description("是否成功")
private boolean isSuccess;
@Description("返回代码")
private String rtnCode;
@Description("返回信息")
private String rtnMessage;
@Description("返回详细信息")
private T result;
}
利用泛型T,实现信息的自由扩展。
- dto类
package com.example.demo.dto;
import lombok.Data;
@Data
public class RequestDto {
private String productName;
private String productAddress;
private double price;
}
package com.example.demo.dto;
import lombok.Data;
@Data
public class ResponseDto {
private String evaluate;
private Integer stars;
}
- controller类
package com.example.demo.controller;
import com.example.demo.dto.RequestDto;
import com.example.demo.dto.ResponseDto;
import com.example.demo.template.WeChatRequestMessage;
import com.example.demo.template.WeChatResponseMessage;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping(value = "/test",method = RequestMethod.POST)
public ResponseEntity<WeChatResponseMessage<ResponseDto>> test(@RequestBody WeChatRequestMessage<RequestDto> req){
//返回值
WeChatResponseMessage<ResponseDto> rsp = new WeChatResponseMessage<>();
//获取请求参数
RequestDto requestParams = req.getRequestParams();
System.out.println(requestParams.getPrice());
System.out.println(requestParams.getProductName());
System.out.println(requestParams.getProductAddress());
System.out.println(req.getSysId());
System.out.println(req.getTransCode());
System.out.println(req.getTransName());
/**
* 业务处理。。。。
*/
//拼装返回参数
ResponseDto responseDto = new ResponseDto();
responseDto.setEvaluate("非常好吃,孩子已经吃了两箱了");
responseDto.setStars(5);
rsp.setRtnCode("200");
rsp.setSuccess(true);
rsp.setRtnMessage("交易完成");
rsp.setResult(responseDto);
return ResponseEntity.ok(rsp);
}
}
- 利用postMan进行测试