1. Restful API 接口 1.1 什么是REST Representational state Transfer
表现层状态转化,可以总结为一句话:REST是所有web应用都应该遵守的架构设计指导原则 。
面向资源是Rest最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,是以名词为核心来组织的, REST要求,必须通过统一的接口对资源执行各种操作,对于每个资源只能执行一组有限的操作
1.2 什么是RESTful API 符合 REST 设计标准的 API,即 RESTful API 。REST 架构设计,遵循的各项标准和准则,就是 HTTP 协议的表现,换句话说,HTTP 协议就是属于 REST 架构的设计模式。比如,无状态,请求-响应。
2. 为什么要统一封装接口
现在大多数的项目采用前后分离的模式进行开发,统一放回方便前端进行开发和封装,以及出现时给出响应编码。
以查询某个用户接口而言,如果没有封装,返回结果如下
1 2 3 4 { "userId" : 1 , "userName" : "赵一" }
如果封装来,返回正常的结果如下:
1 2 3 4 5 6 7 8 9 { "timestamp" : 202305121141 , "status" : 200 , "message" : "success" , "data" : { "userId" : 1 , "userName" : "赵一" } }
异常返回结果如下:
1 2 3 4 5 6 7 { "timestamp" : 202305121141 , "status" : 10001 , "message" : "User not exist" , "data" : null }
3. 实现案例 3.1 状态码封装 这里异常讲的状态码为例,包含responseCode和description两个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import lombok.AllArgsConstructor;import lombok.Getter;import java.util.Arrays;import java.util.Collections;import java.util.List;@Getter @AllArgsConstructor public enum ResponseStatus { SUCCESS("200" , "success" ), FAIL("500" , "failed" ), HTTP_STATUS_200("200" , "ok" ), HTTP_STATUS_400("400" , "request error" ), HTTP_STATUS_401("401" , "no authentication" ), HTTP_STATUS_403("403" , "no authorities" ), HTTP_STATUS_500("500" , "server error" ); public static final List<ResponseStatus> HTTP_STATUS_ALL = Collections.unmodifiableList( Arrays.asList(HTTP_STATUS_200, HTTP_STATUS_400, HTTP_STATUS_401, HTTP_STATUS_403, HTTP_STATUS_500 )); private final String responseCode; private final String description; }
3.2 返回内容封装 包含公共的接口返回时间,状态status, 消息message,以及数据data。 考虑到数据的序列化(比如在网络上传输),这里data有时候还会extends Serializable
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 public class ResponseResult <T > { private long timestamp; private String status; private String message; private T data; public static <T> ResponseResult<T> success () { return success(null ); } public static <T> ResponseResult<T> success (T data) { return ResponseResult.<T>builder().data(data) .message(ResponseStatus.SUCCESS.getDescription()) .status(ResponseStatus.SUCCESS.getResponseCode()) .timestamp(System.currentTimeMillis()) .build(); } public static <T extends Serializable> ResponseResult<T> fail (String code, String message) { return fail(null , code, message); } public static <T> ResponseResult<T> fail (T data, String code, String message) { return ResponseResult.<T>builder().data(data) .message(message) .status(code) .timestamp(System.currentTimeMillis()) .build(); } }
3.3 接口返回时调用 在接口返回时调用,以用户接口为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 @RestController @RequestMapping("/user") public class UserController { @Autowired private IUserService userService; @ApiOperation("Add/Edit User") @PostMapping("add") public ResponseResult<User> add (User user) { if (user.getId()==null || !userService.exists(user.getId())) { user.setCreateTime(LocalDateTime.now()); user.setUpdateTime(LocalDateTime.now()); userService.save(user); } else { user.setUpdateTime(LocalDateTime.now()); userService.update(user); } return ResponseResult.success(userService.find(user.getId())); } @ApiOperation("Query User One") @GetMapping("edit/{userId}") public ResponseResult<User> edit (@PathVariable("userId") Long userId) { return ResponseResult.success(userService.find(userId)); } }
原文链接:https://pdai.tech/md/spring/springboot/springboot-x-interface-response.html