1. 程式人生 > 程式設計 >SpringBoot 統一請求返回的實現

SpringBoot 統一請求返回的實現

目前我們的返回是直接把實體類扔給請求方,這樣很不友好,一方面沒有統一的格式,二來請求方不知道請求成功與否,沒有一個可以判斷的東西,也沒有說明性的返回。

本篇就來為所有介面提供一個統一的友好返回。

確定返回結構

首先,我們先確定好我們介面返回的格式是什麼樣的,然後再一步一步實現下面的。

{
 "code": 200,"msg": "ok","data": ""
}
  • code 欄位表示狀態碼,呼叫方根據該碼來作為後續邏輯的依據,比如 code 值為 200 表示操作成功,沒有邏輯錯誤,此時可以提示使用者操作成功等;code 值不為 200 表示操作失敗,比如為 1001 ,表示使用者名稱已存在,此時前端做一些相應操作。
  • msg 欄位用來充當額外說明,比如上面說的狀態為 1001,這裡的 msg 就可以是 username exists 這樣的說明性文字,幫助呼叫方更好的理解。
  • data 欄位一般是在 code 值為 200 的時候,返回具體的業務資料,可以是陣列,也可以是物件。

建立返回碼

根據上面定的返回結構,我們可以把 code 和 msg 欄位用列舉型別整合,在專案中建立 common 目錄,新建 ApiCode.java 如下程式碼所示:

package com.foxescap.wxbox.common;

/**
 * 全域性介面狀態碼
 * @author xfly
 */
public enum ApiCode {
  /**
   * 通用成功
   */
  API_OK(200,"ok"),/**
   * 使用者名稱已存在
   */
  API_USERNAME_EXIST(1001,"username exists");

  private final int code;

  private final String msg;

  ApiCode(int code,String msg) {
    this.code = code;
    this.msg = msg;
  }

  public int code() {
    return this.code;
  }

  public String getMsg() {
    return this.msg;
  }
}

之後每有一個不同的錯誤程式碼都需要在這裡加上,然後呼叫這裡的列舉變數。可能會有點繁瑣,但當專案逐漸大起來以後,這樣做就能很好的管理狀態碼。

建立返回類

在專案中建立 common 目錄,新建 HttpResponse.java 檔案:

package com.foxescap.wxbox.common;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

/**
 * @author xfly
 * @param <T>
 */
@Data
@AllArgsConstructor
@JsonPropertyOrder({"code","msg","data"})
public class ApiResponse<T> implements Serializable {
  private static final long serialVersionUID = 1L;

  /**
   * 自定義返回碼
   */
  private int code;

  /**
   * 自定義返回說明
   */
  private String msg;

  /**
   * 返回資料
   */
  private T data;

  /**
   * 成功返回,無資料
   *
   * @return 自定義的 ApiResponse 物件
   */
  public static ApiResponse<Object> success() {
    return new ApiResponse<>(ApiCode.API_OK.code(),ApiCode.API_OK.getMsg(),"");
  }

  /**
   * 成功返回,有資料
   *
   * @param object 返回資料
   * @param <T>  返回資料型別
   * @return 自定義的 ApiResponse 物件
   */
  public static <T> ApiResponse<T> success(T object) {
    return new ApiResponse<>(ApiCode.API_OK.code(),object);
  }

  /**
   * 失敗返回
   *
   * @param apiCode 錯誤碼
   * @return 自定義的 ApiResponse 物件
   */
  public static ApiResponse<Object> fail(ApiCode apiCode) {
    return new ApiResponse<>(apiCode.code(),apiCode.getMsg(),"");
  }
}

使用返回類

我們修改一下 Controller 裡面的介面返回,現在不是直接返回實體類了,而是封裝成我們的返回類,再返回給呼叫方:

@GetMapping("/user/{username}")
public ApiResponse<User> findUserByUsername(@PathVariable(name = "username") String username) {
  return ApiResponse.success(userService.findByUsername(username));
}

到此這篇關於SpringBoot 統一請求返回的實現的文章就介紹到這了,更多相關SpringBoot 統一請求返回內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!