封裝springboot接口響應(yīng)

封裝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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容