封装springboot接口响应
有过前后端分类开发的朋友们,会接触到统一接口返回标准,
比如访问如下接口:
https://test.2021.08.11.facecto.com/testapi
注意本接口是杜撰的,不存在。
返回的如下:
{
"data": {
"id": 1,
"name": "JonSo",
"url": "https://facecto.com"
},
"code": 0,
"message": "OK",
"status": "SUCCESS"
}
对于大牛来说,so easy,对于刚玩不久的伙伴们应该略有疑问。
本篇文章摊开说说如何实现这种效果。
从看的见的地方入手
从标准返回接口的json数据可以猜测到,数据是被封装在某个result中了。
很聪明,这个返回结果就是一个CodeResult,咱们先推测下,应该是这个样子:
CodeResult
public class CodeResult<T> {
private T data;
private Integer code;
private String message;
private String status;
}
对的,它就长这样。这里咱们用了泛型。
当然它还不能工作:1、需要可系列化,2、需要可实例化、并且封装下状态码。我们一睹红颜:
public class CodeResult<T> implements Serializable {
private static final long serialVersionUID = 6374486752803150412L;
private T data;
private Integer code;
private String message;
private ResultStatus status;
public CodeResult() {
this.code = 0;
this.message = ResultMessage.SYSTEM_OK.getValue();
this.status = ResultStatus.SUCCESS;
}
private CodeResult(Integer code, String message, ResultStatus status) {
this.code = code;
this.message = message;
this.status = status;
}
private CodeResult(Integer code, String message, ResultStatus status, T data) {
this.code = code;
this.message = message;
this.status = status;
this.data = data;
}
public static <T> CodeResult<T> error() {
return new CodeResult(HttpStatus.SC_INTERNAL_SERVER_ERROR, ResultMessage.SYSTEM_ERROR.getValue(), ResultStatus.FAIL);
}
public static <T> CodeResult<T> error(String message) {
return new CodeResult(HttpStatus.SC_INTERNAL_SERVER_ERROR, message, ResultStatus.FAIL);
}
public static <T> CodeResult<T> error(int code, String message) {
return new CodeResult(code, message, ResultStatus.FAIL);
}
public static <T> CodeResult<T> ok() {
return new CodeResult();
}
public static <T> CodeResult<T> ok(String message) {
return new CodeResult(0, message, ResultStatus.SUCCESS);
}
public static <T> CodeResult<T> ok(String message, T data) {
return new CodeResult(0, message, ResultStatus.SUCCESS, data);
}
public static <T> CodeResult<T> okx(T data) {
return new CodeResult(0, ResultMessage.SYSTEM_SUCCESS.getValue(), ResultStatus.SUCCESS, data);
}
}
基本上这个方法已经能工作了。
ResultStatus是个枚举。
public enum ResultStatus {
SUCCESS(0),
FAIL(1);
private int code;
ResultStatus(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
public String getName() {
return this.name();
}
}
怎么使用
新建一个Controller
@RestController
public class UserController {
@GetMapping(value = "/")
public CodeResult getUser(){
User u = new User().setUrl("https://facecto.com").setId(1).setName("JonSo");
return CodeResult.ok("OK", u);
}
}
再访问看看,是不是很简单,已经是格式化的json展示了。
不想动手copy怎么办?
不用担心,进来看文章了,自然不会太失望。我已经封装好了以上的代码放到中央仓上去了,只要
Maven引用
<dependency>
<groupId>com.facecto.code</groupId>
<artifactId>facecto-code-base-starter</artifactId>
<version>1.0.2</version>
</dependency>
便可以略过前面的内容,直接写RestController使用了。
方便吧。
原文地址:https://www.facecto.com/archives/790.html