封裝springboot接口響應(yīng)
有過(guò)前后端分類(lèi)開(kāi)發(fā)的朋友們,會(huì)接觸到統(tǒng)一接口返回標(biāo)準(zhǔn),
比如訪(fǎng)問(wèn)如下接口:
https://test.2021.08.11.facecto.com/testapi
注意本接口是杜撰的,不存在。
返回的如下:
{
"data": {
"id": 1,
"name": "JonSo",
"url": "https://facecto.com"
},
"code": 0,
"message": "OK",
"status": "SUCCESS"
}
對(duì)于大牛來(lái)說(shuō),so easy,對(duì)于剛玩不久的伙伴們應(yīng)該略有疑問(wèn)。
本篇文章攤開(kāi)說(shuō)說(shuō)如何實(shí)現(xiàn)這種效果。
從看的見(jiàn)的地方入手
從標(biāo)準(zhǔn)返回接口的json數(shù)據(jù)可以猜測(cè)到,數(shù)據(jù)是被封裝在某個(gè)result中了。
很聰明,這個(gè)返回結(jié)果就是一個(gè)CodeResult,咱們先推測(cè)下,應(yīng)該是這個(gè)樣子:
CodeResult
public class CodeResult<T> {
private T data;
private Integer code;
private String message;
private String status;
}
對(duì)的,它就長(zhǎng)這樣。這里咱們用了泛型。
當(dāng)然它還不能工作:1、需要可系列化,2、需要可實(shí)例化、并且封裝下?tīng)顟B(tài)碼。我們一睹紅顏:
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);
}
}
基本上這個(gè)方法已經(jīng)能工作了。
ResultStatus是個(gè)枚舉。
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();
}
}
怎么使用
新建一個(gè)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);
}
}
再訪(fǎng)問(wèn)看看,是不是很簡(jiǎn)單,已經(jīng)是格式化的json展示了。
不想動(dòng)手copy怎么辦?
不用擔(dān)心,進(jìn)來(lái)看文章了,自然不會(huì)太失望。我已經(jīng)封裝好了以上的代碼放到中央倉(cāng)上去了,只要
Maven引用
<dependency>
<groupId>com.facecto.code</groupId>
<artifactId>facecto-code-base-starter</artifactId>
<version>1.0.2</version>
</dependency>
便可以略過(guò)前面的內(nèi)容,直接寫(xiě)RestController使用了。
方便吧。
原文地址:https://www.facecto.com/archives/790.html