【Java學習】API介面數據規範

来源:https://www.cnblogs.com/pbinlog/archive/2022/04/11/16130383.html
-Advertisement-
Play Games

在日常開發中,一個優雅的API,必須提供簡單明瞭的響應值,然後根據狀態碼就可以大概知道問題的所在。這裡主要整理一下HTTP狀態碼和自定義狀態碼。 1、HTTP狀態碼 當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在伺服器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的伺服器會返回一個包含 HTTP ...


在日常開發中,一個優雅的API,必須提供簡單明瞭的響應值,然後根據狀態碼就可以大概知道問題的所在。這裡主要整理一下HTTP狀態碼和自定義狀態碼。

 

1、HTTP狀態碼

當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在伺服器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的伺服器會返回一個包含 HTTP 狀態碼的信息頭(server header)用以響應瀏覽器的請求。

 

常見的HTTP狀態碼有:

200-請求成功。

301-資源(網頁等)被永久轉移到其它URL。

403-伺服器拒絕訪問。驗證身份通過了,但是資源沒有許可權進行操作。

404-請求資源(網頁等)不存在。

500-內部伺服器錯誤。

504-網關超時。伺服器作為網關或代理,但是沒有及時從上游伺服器收到請求。

 

 

2、HTTP狀態碼分類

HTTP狀態碼可以分為5類:消息響應、成功響應、重定向、客戶端錯誤、伺服器錯誤。

狀態

描述

100

繼續。客戶端應繼續其請求

101

切換協議。伺服器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到HTTP的新版本協議。

200

請求成功。一般用於GET與POST請求。

201

已創建。成功請求並創建了新的資源。

202

已接受。已經接受請求,但未處理完成。

203

非授權信息。請求成功。但返回的meta信息不在原始的伺服器,而是一個副本。

204

無內容。伺服器成功處理,但未返回內容。

205

重置內容。

300

多種選擇。請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用於用戶終端(例如:瀏覽器)選擇。

301

永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替。

302

臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI。

303

查看其它地址。與301類似。使用GET和POST請求查看。

304

未修改。所請求的資源未修改,伺服器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之後修改的資源。

305

使用代理。所請求的資源必須通過代理訪問。

400

客戶端請求的語法錯誤,伺服器無法理解。

401

用戶身份認證失敗。

402

保留,將來使用。

403

驗證身份通過了,但是資源沒有許可權進行操作。

404

伺服器無法根據客戶端的請求找到資源(網頁)。

405

客戶端請求中的方法被禁止。

500

伺服器內部錯誤,無法完成請求。

501

伺服器不支持請求的功能,無法完成請求。

502

作為網關或者代理工作的伺服器嘗試執行請求時,從遠程伺服器接收到了一個無效的響應

503

由於超載或系統維護,伺服器暫時的無法處理客戶端的請求。

504

伺服器作為網關或代理,但是沒有及時從上游伺服器收到請求。

 

 

3、自定義響應狀態碼規範

後端返回給前端一般使用json格式,定義如下:

{
    #返回狀態碼
    Code:integer,
    #返回信息描述
    message:string,
    #返回值
    data:object
}

 

 

3.1、返回介面

public interface IResultStatus {
    /**
     * 狀態碼
     * @return
     */
    Integer errorCode();
    /**
     * 異常信息
     * @return
     */
    String errorMsg();
}

 

 

3.2、狀態碼枚舉:

public enum ResultStatus implements IResultStatus {
    /**
     * 狀態碼及對應信息
     */
    //成功狀態碼
    SUCCESS(0, "執行成功"),
    //參數錯誤:1001~1999
    PARAM_IS_INVALID(1001, "參數無效"),
    PARAM_IS_BLANK(1002, "參數為空"),
    PARAM_TYPE_BIND_ERROR(1003, "參數類型錯誤"),
    //用戶錯誤:2001~2999
    USER_LOGIN_ERROR(2001, "賬號不存在或密碼錯誤"),
    USER_ACCOUNT_FORBIDDEN(2002, "賬戶已被禁用"),
    USER_NOT_EXIST(2003, "用戶不存在");
    private int errorCode;
    private String errorMsg;
    ResultStatus(int errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }
    @Override
    public Integer errorCode() {
        return errorCode;
    }
    @Override
    public String errorMsg() {
        return errorMsg;
    }
}

 

狀態碼和信息就會一一對應,比較好維護。這樣前端同事在得到返回值後,根據狀態碼就可以知道,大概是什麼錯誤,再根據message相關的信息描述,可以快速定位。

 

3.3、返回數據體

json格式,根據不同的業務有不同的json體,可以設計一個返回體類Result

@Data
public class Result<T> {
    private Integer code;
    private String message;
    private Object data;
    public Result(ResultStatus restStatus, Object data) {
        this.code = restStatus.errorCode();
        this.message = restStatus.errorMsg();
        this.data = data;
    }
    /**
     * 業務成功返回業務代碼和描述信息
     */
    public static Result<Void> success() {
        return new Result<Void>(ResultStatus.SUCCESS, null);
    }
    /**
     * 業務成功返回業務代碼,描述和返回的參數
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>(ResultStatus.SUCCESS, data);
    }
    /**
     * 業務成功返回業務代碼,描述和返回的參數
     */
    public static <T> Result<T> success(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return success(data);
        }
        return new Result<T>(resultStatus, data);
    }
    /**
     * 業務異常返回業務代碼和描述信息
     */
    public static <T> Result<T> failure() {
        return new Result<T>(ResultStatus.PARAM_TYPE_BIND_ERROR, null);
    }
    /**
     * 業務異常返回業務代碼,描述和返回的參數
     */
    public static <T> Result<T> failure(ResultStatus resultStatus) {
        return failure(resultStatus, null);
    }
    /**
     * 業務異常返回業務代碼,描述和返回的參數
     */
    public static <T> Result<T> failure(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return new Result<T>(ResultStatus.PARAM_IS_INVALID, null);
        }
        return new Result<T>(resultStatus, data);
    }
}

 

 

3.4、返回體測試

@RestController
@RequestMapping("/api/demo2")
public class Demo2Controller {
    private static final HashMap<String, Object> INFO;
    static {
        INFO = new HashMap<>();
        INFO.put("name", "張三");
        INFO.put("age", "25");
    }
    @GetMapping("/getInfo")
    public Map<String, Object> getInfo() {
        return INFO;
    }
    @GetMapping("/getInfoResult")
    public Result<Map<String, Object>> getInfoResult() {
        return Result.success(INFO);
    }
}

 

 

結果參考:

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程式員以優雅的思維方式進行複雜的編程。 Java具有簡單性、面向對... ...
  • 1. Seata的架構 Seata是 2019 年 1 月份螞蟻金服和阿裡巴巴共同開源的分散式事務解決方案。致力於提供高性能和簡單易用的分散式事務服務,為用戶打造一站式的分散式解決方案。 官網地址:http://seata.io/,其中的文檔、播客中提供了大量的使用說明、源碼分析。 Seata事務管 ...
  • 上周五夜間,服務端程式發版期間,客戶端程式在通過http調用服務端介面時出現一堆 “拒絕連接 (Connection refused) ” 異常。 2022-04-08 22:22:28,676 ERROR [2022040822222771523885] ? (com.cn.yft.pay.uti ...
  • 說在前面的話 前言 內容介紹 介紹 JavaSE 基礎的基本語法知識,不會包含特別難以理解或更深層次的內容,通俗易懂。 前提 本書的所有例子使用 JDK8 在 Windows10 系統下完成,所以預設使用 exe;若你與我的不一致,快捷鍵、源碼都有可能不同,但網上無償資源十分的多,搜索瞭解不同之處即 ...
  • 第零章 說在前面的話 1.1.0.1 前言 1.1.0.2 自序 第一章 JDK 1.1.1.1 Java 介紹 1.1.1.2 JDK 下載 1.1.1.3 編寫代碼前的準備 1.1.1.4 Typora 軟體簡單使用 1.1.1.5 常用的 DOS 命令 1.1.1.6 Jopin 使用 1.1 ...
  • 自從2020年進入公司從學生變成社會人以來,接手的第一項工作就是檢查並整改公司終端的季度考核指標; 季度考核是公司總部要求的,每季度一次(廢話。。),主要就是檢查內網終端各類管理軟體(桌面管理、防病毒等等)的安裝率與版本合規情況; 需要管理的終端量在1500台左右,各類軟體都有總部提供的平臺,需要做 ...
  • 前言 內容介紹 介紹 JavaSE 基礎的基本語法知識,不會包含特別難以理解或更深層次的內容,通俗易懂。 前提 本書的所有例子使用 JDK8 在 Windows10 系統下完成,所以預設使用 exe;若你與我的不一致,快捷鍵、源碼都有可能不同,但網上無償資源十分的多,搜索瞭解不同之處即可。 受眾人群 ...
  • 前言 為什麼要學習python?是因為不僅很多工作需要用到python,同時我們可以利用python做很多好玩兒的事兒。 今天就來教大家如何利用python製作動態二維碼。 代碼說明:我們以小豬佩奇gif圖片為例,如果我們利用的背景圖是gif動態圖,生成的就是動態二維碼。如果利用的背景是靜態 圖,生 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...