亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解SpringBoot如何實(shí)現(xiàn)統(tǒng)一后端返回格式

 更新時(shí)間:2022年04月26日 11:35:29   作者:北根娃  
在前后端分離的項(xiàng)目中后端返回的格式一定要友好,不然會(huì)對(duì)前端的開發(fā)人員帶來很多的工作量。那么SpringBoot如何做到統(tǒng)一的后端返回格式呢?本文將為大家詳細(xì)講講

在前后端分離的項(xiàng)目中后端返回的格式一定要友好,不然會(huì)對(duì)前端的開發(fā)人員帶來很多的工作量。那么SpringBoot如何做到統(tǒng)一的后端返回格式呢?今天我們一起來看看。

1.為什么要對(duì)SpringBoot返回統(tǒng)一的標(biāo)準(zhǔn)格式

在默認(rèn)情況下,SpringBoot的返回格式常見的有三種:

1.1 返回String

@GetMapping("/hello")
public String hello() {
    return  "hello";
}

此時(shí)調(diào)用接口獲取到的返回值是這樣:

hello

1.2 返回自定義對(duì)象

@GetMapping("/student")
public Student getStudent() {
        Student student = new Student();
        student.setId(1);
        student.setName("didiplus");
        return  student;
}


//student的類
@Data
public class Student {
    private Integer id;
    private String name;
}

此時(shí)調(diào)用接口獲取到的返回值是這樣:

{"id":1,"name":"didiplus"}

1.3 接口異常

@GetMapping("/error")
public int error(){
    int i = 9/0;
    return i;
}

此時(shí)調(diào)用接口獲取到的返回值是這樣

SpringBoot的版本是v2.6.7,

2.定義返回對(duì)象

package com.didiplus.common.web.response;

import lombok.Data;

import java.io.Serializable;

/**
 * Author: didiplus
 * Email: 972479352@qq.com
 * CreateTime: 2022/4/24
 * Desc: Ajax 返 回 JSON 結(jié) 果 封 裝 數(shù) 據(jù)
 */

@Data
public class Result<T> implements Serializable {

    /**
     * 是否返回成功
     */
    private boolean success;

    /**
     * 錯(cuò)誤狀態(tài)
     */
    private int code;

    /***
     * 錯(cuò)誤信息
     */
    private String msg;

    /**
     * 返回?cái)?shù)據(jù)
     */
    private T data;

    /**
     * 時(shí)間戳
     */
    private long timestamp ;


    public Result (){
        this.timestamp = System.currentTimeMillis();
    }
    /**
     * 成功的操作
     */
    public static <T> Result<T> success() {
        return  success(null);
    }

    /**
     * 成 功 操 作 , 攜 帶 數(shù) 據(jù)
     */
    public static <T> Result<T> success(T data){
        return success(ResultCode.RC100.getMessage(),data);
    }

    /**
     * 成 功 操 作, 攜 帶 消 息
     */
    public static <T> Result<T> success(String message) {
        return success(message, null);
    }

        /**
         * 成 功 操 作, 攜 帶 消 息 和 攜 帶 數(shù) 據(jù)
         */
    public static <T> Result<T> success(String message, T data) {
        return success(ResultCode.RC100.getCode(), message, data);
    }

    /**
     * 成 功 操 作, 攜 帶 自 定 義 狀 態(tài) 碼 和 消 息
     */
    public static <T> Result<T> success(int code, String message) {
        return success(code, message, null);
    }

    public static <T> Result<T> success(int code,String message,T data) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setSuccess(true);
        result.setData(data);
        return result;
    }

    /**
     * 失 敗 操 作, 默 認(rèn) 數(shù) 據(jù)
     */
    public static <T> Result<T> failure() {
        return failure(ResultCode.RC100.getMessage());
    }

    /**
     * 失 敗 操 作, 攜 帶 自 定 義 消 息
     */
    public static <T> Result<T> failure(String message) {
        return failure(message, null);
    }

    /**
     * 失 敗 操 作, 攜 帶 自 定 義 消 息 和 數(shù) 據(jù)
     */
    public static <T> Result<T> failure(String message, T data) {
        return failure(ResultCode.RC999.getCode(), message, data);
    }

    /**
     * 失 敗 操 作, 攜 帶 自 定 義 狀 態(tài) 碼 和 自 定 義 消 息
     */
    public static <T> Result<T> failure(int code, String message) {
        return failure(ResultCode.RC999.getCode(), message, null);
    }

    /**
     * 失 敗 操 作, 攜 帶 自 定 義 狀 態(tài) 碼 , 消 息 和 數(shù) 據(jù)
     */
    public static <T> Result<T> failure(int code, String message, T data) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setSuccess(false);
        result.setData(data);
        return result;
    }

    /**
     * Boolean 返 回 操 作, 攜 帶 默 認(rèn) 返 回 值
     */
    public static <T> Result<T> decide(boolean b) {
        return decide(b, ResultCode.RC100.getMessage(), ResultCode.RC999.getMessage());
    }

    /**
     * Boolean 返 回 操 作, 攜 帶 自 定 義 消 息
     */
    public static <T> Result<T> decide(boolean b, String success, String failure) {
        if (b) {
            return success(success);
        } else {
            return failure(failure);
        }
    }
}

3.定義狀態(tài)碼

package com.didiplus.common.web.response;

import lombok.Getter;

/**
 * Author: didiplus
 * Email: 972479352@qq.com
 * CreateTime: 2022/4/24
 * Desc: 統(tǒng) 一 返 回 狀 態(tài) 碼
 */
public enum ResultCode {
    /**操作成功**/
    RC100(100,"操作成功"),
    /**操作失敗**/
    RC999(999,"操作失敗"),
    /**服務(wù)限流**/
    RC200(200,"服務(wù)開啟限流保護(hù),請(qǐng)稍后再試!"),
    /**服務(wù)降級(jí)**/
    RC201(201,"服務(wù)開啟降級(jí)保護(hù),請(qǐng)稍后再試!"),
    /**熱點(diǎn)參數(shù)限流**/
    RC202(202,"熱點(diǎn)參數(shù)限流,請(qǐng)稍后再試!"),
    /**系統(tǒng)規(guī)則不滿足**/
    RC203(203,"系統(tǒng)規(guī)則不滿足要求,請(qǐng)稍后再試!"),
    /**授權(quán)規(guī)則不通過**/
    RC204(204,"授權(quán)規(guī)則不通過,請(qǐng)稍后再試!"),
    /**access_denied**/
    RC403(403,"無訪問權(quán)限,請(qǐng)聯(lián)系管理員授予權(quán)限"),
    /**access_denied**/
    RC401(401,"匿名用戶訪問無權(quán)限資源時(shí)的異常"),
    /**服務(wù)異常**/
    RC500(500,"系統(tǒng)異常,請(qǐng)稍后重試"),

    INVALID_TOKEN(2001,"訪問令牌不合法"),
    ACCESS_DENIED(2003,"沒有權(quán)限訪問該資源"),
    CLIENT_AUTHENTICATION_FAILED(1001,"客戶端認(rèn)證失敗"),
    USERNAME_OR_PASSWORD_ERROR(1002,"用戶名或密碼錯(cuò)誤"),
    UNSUPPORTED_GRANT_TYPE(1003, "不支持的認(rèn)證模式");

    /**自定義狀態(tài)碼**/
    @Getter
    private final int code;

    /**
     * 攜 帶 消 息
     */
    @Getter
    private final String message;
    /**
     * 構(gòu) 造 方 法
     */
    ResultCode(int code, String message) {

        this.code = code;

        this.message = message;
    }
}

4.統(tǒng)一返回格式

    @GetMapping("/hello")
    public Result<String> hello() {
        return  Result.success("操作成功","hello");
    }

此時(shí)調(diào)用接口獲取到的返回值是這樣:

{"success":true,"code":100,"msg":"操作成功","data":"hello","timestamp":1650785058049}

這樣確實(shí)已經(jīng)實(shí)現(xiàn)了我們想要的結(jié)果,我在很多項(xiàng)目中看到的都是這種寫法,在Controller層通過Result.success()對(duì)返回結(jié)果進(jìn)行包裝后返回給前端。這樣顯得不夠?qū)I(yè)而且不夠優(yōu)雅。 所以呢我們需要對(duì)代碼進(jìn)行優(yōu)化,目標(biāo)就是不要每個(gè)接口都手工制定Result返回值。

5.高級(jí)實(shí)現(xiàn)方式

要優(yōu)化這段代碼很簡單,我們只需要借助SpringBoot提供的ResponseBodyAdvice即可。

5.1 ResponseBodyAdvice的源碼

public interface ResponseBodyAdvice<T> {
		/**
		* 是否支持advice功能
		* true 支持,false 不支持
		*/
    boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2);

	  /**
		* 對(duì)返回的數(shù)據(jù)進(jìn)行處理
		*/
    @Nullable
    T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}

只需要編寫一個(gè)具體實(shí)現(xiàn)類即可

@RestControllerAdvice
public class ResponseAdvice  implements ResponseBodyAdvice<Object> {


    @Autowired
    ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response)  {
        if (body instanceof  String){
            return objectMapper.writeValueAsString(Result.success(ResultCode.RC100.getMessage(),body));
        }
        return Result.success(ResultCode.RC100.getMessage(),body);
    }
}

需要注意兩個(gè)地方:

@RestControllerAdvice注解 @RestControllerAdvice是@RestController注解的增強(qiáng),可以實(shí)現(xiàn)三個(gè)方面的功能:

  • 全局異常處理
  • 全局?jǐn)?shù)據(jù)綁定
  • 全局?jǐn)?shù)據(jù)預(yù)處理

5.2 String類型判斷

        if (body instanceof  String){
            return objectMapper.writeValueAsString(Result.success(ResultCode.RC100.getMessage(),body));
        }

這段代碼一定要加,如果Controller直接返回String的話,SpringBoot是直接返回,故我們需要手動(dòng)轉(zhuǎn)換成json。 經(jīng)過上面的處理我們就再也不需要通過ResultData.success()來進(jìn)行轉(zhuǎn)換了,直接返回原始數(shù)據(jù)格式,SpringBoot自動(dòng)幫我們實(shí)現(xiàn)包裝類的封裝。

    @GetMapping("/hello")
    public String hello() {
        return "hello,didiplus";
    }


    @GetMapping("/student")
    public Student getStudent() {
        Student student = new Student();
        student.setId(1);
        student.setName("didiplus");
        return student;
    }

此時(shí)我們調(diào)用接口返回的數(shù)據(jù)結(jié)果為:

{ "success": true, "code": 100, "msg": "操作成功", "data": "hello,didiplus", "timestamp": 1650786993454 }

以上就是詳解SpringBoot如何實(shí)現(xiàn)統(tǒng)一后端返回格式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot統(tǒng)一后端返回格式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java字符編碼原理(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java字符編碼原理(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java開發(fā)中,常常會(huì)遇到亂碼的問題,一旦遇到這種問題,常常比較煩惱,大家都不想承認(rèn)是自己的代碼問題,其實(shí)搞明白編碼的本質(zhì)過程就簡單多了,接下來小編給大家?guī)韏ava字符編碼原理,要求看看吧
    2017-04-04
  • Java中JUC?的?Exchange?交換器詳情

    Java中JUC?的?Exchange?交換器詳情

    這篇文章主要介紹了Java中JUC?的?Exchange?交換器詳情,文章基于Java的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 詳解Java類庫的概念以及import的使用方法

    詳解Java類庫的概念以及import的使用方法

    這篇文章主要介紹了詳解Java類庫的概念以及import的使用方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker
    2009-06-06
  • spring boot整合hessian的示例

    spring boot整合hessian的示例

    本文通過實(shí)例代碼給大家介紹了spring boot整合hessian的方法,需要的朋友可以參考下
    2017-07-07
  • mybatis項(xiàng)目兼容mybatis-plus問題

    mybatis項(xiàng)目兼容mybatis-plus問題

    這篇文章主要介紹了mybatis項(xiàng)目兼容mybatis-plus問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • SpringBoot淺析安全管理之Spring Security配置

    SpringBoot淺析安全管理之Spring Security配置

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置
    2022-08-08
  • struts2開發(fā)流程及詳細(xì)配置

    struts2開發(fā)流程及詳細(xì)配置

    這篇文章主要介紹了struts2開發(fā)流程及詳細(xì)配置,步驟比較詳細(xì),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(24)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(24)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)

    SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)

    這篇文章主要介紹了SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01

最新評(píng)論