告別籠統的 200 OK:一份給 API 設計者的 HTTP 狀態碼終極指南

文章目錄

  • 寫在前面
  • 問題描述
  • 核心結論與建議
  • 簡要描述
  • 詳細闡述
    • 1xx - 信息性響應 (Informational)
    • 2xx - 成功 (Successful)
    • 3xx - 重定向 (Redirection)
    • 4xx - 客戶端錯誤 (Client Error)
    • 5xx - 服務器錯誤 (Server Error)
  • HTTP 狀態碼速查表
  • 參考以及更多更詳細的狀態碼查詢

寫在前面

你是否見過這樣的 API:無論操作成功、參數錯誤還是找不到資源,它都固執地返回 200 OK,然后把真正的狀態信息藏在響應體的某個角落,比如 {“code”: 5001, “message”: “參數不能為空”}?
這種設計看似“統一”,實則嚴重違反了 RESTful 的核心原則,極大地增加了客戶端的對接成本和出錯概率。HTTP 狀態碼并非擺設,它們是服務器與客戶端之間溝通的標準語言,是 API 自我描述能力的重要組成部分。
本文旨在建立一套清晰、統一的 HTTP 狀態碼使用規范,幫助你和你的團隊構建出更健壯、更易于理解和使用的 API。

問題描述

在RESTful API設計中,僅僅返回200(成功)或500(服務器錯誤)是遠遠不夠的。不規范的狀態碼會嚴重影響API的可用性和開發者的對接效率。

本次調研旨在建立一套清晰、統一的HTTP狀態碼使用規范,核心目標是:當API調用出現各類情況(如參數不合法、無權限、資源不存在等)時,能夠返回最恰當的狀態碼和最清晰的錯誤信息,提升API的健壯性和開發者體驗。

核心結論與建議

參數不合法應該返回什么?

首選答案:400 Bad Request

這是最通用、最符合HTTP規范的選擇。當服務器因客戶端發送的請求本身有錯誤(例如,數據格式錯誤、缺少必需參數、參數值超出業務范圍等)而無法處理時,應返回此狀態碼。

更精確的選擇:422 Unprocessable Entity

在特定場景下,422 是比 400 更精確的補充。它們的區別在于:

  • 400 Bad Request: 請求語法有誤。服務器無法理解請求,如JSON格式損壞。
  • 422 Unprocessable Entity: 請求語義有誤。服務器能理解請求,但因業務規則限制無法處理,如必填字段為空、年齡為負數。

對于絕大多數團隊,統一使用 400 Bad Request 來表示所有類型的參數驗證失敗,是更簡單且完全可接受的最佳實踐

簡要描述

HTTP狀態碼是RESTful API設計中非常核心的一部分,是三位整數代碼,它們是服務器與客戶端之間溝通的“標準語言”。

HTTP 狀態碼是可擴展的。HTTP 客戶端無需理解所有已注冊狀態碼的含義,盡管理解這些含義顯然是更好的。但是,客戶端必須理解任何狀態碼的類別(由第一位數字指示),并將無法識別的狀態碼視為該類別的 x00 狀態碼,例如,如果客戶端收到無法識別的狀態碼 471,則客戶端可以假定其請求存在問題,并將該響應視為收到了 400(錯誤請求)狀態碼。響應消息通常包含一個解釋狀態的表示。

這些狀態碼被分為五大類,由第一位數字標識(第一位數字定義了響應的類別,最后兩位數字不具有任何分類作用):

  • 1xx (Informational): 信息性響應 - 表示請求已接收,繼續處理。
  • 2xx (Successful): 成功 - 表示請求已被成功接收、理解、并接受。
  • 3xx (Redirection): 重定向 - 表示需要客戶端采取進一步的操作才能完成請求。
  • 4xx (Client Error): 客戶端錯誤 - 表示請求包含語法錯誤或無法完成請求。
  • 5xx (Server Error): 服務器錯誤 - 表示服務器在處理一個看似有效的請求時發生錯誤。

詳細闡述

1xx - 信息性響應 (Informational)

這類狀態碼在日常API開發中非常少見,主要用于協議內部交互。

100 Continue (繼續):客戶端準備發送一個大的請求體(如POST一個大文件)時,可以先發送一個只包含頭信息的請求,并攜帶Expect: 100-continue頭。如果服務器愿意接收,就返回100,客戶端再繼續發送請求體。這可以避免因服務器拒絕而浪費帶寬。

101 Switching Protocols (切換協議):客戶端請求升級協議(例如,從HTTP/1.1升級到WebSocket),服務器同意切換時返回此碼。

102 Processing (處理中):(WebDAV擴展) 一個請求可能包含多個子操作,需要較長時間完成。服務器返回102以防止客戶端超時,表示請求已收到且正在處理中。

2xx - 成功 (Successful)

這是API設計中最常用的一類,表示操作成功。

200 OK (成功)最通用的成功狀態碼。表示請求已成功,響應體中通常包含請求的資源。適用于GET(獲取數據)、PUT(更新整個資源)、PATCH(部分更新資源)以及不創建新資源的POST操作的成功響應。

201 Created (已創建)專門用于創建新資源。當客戶端通過POST請求成功創建了一個新資源時返回。最佳實踐是在響應頭的Location字段中包含新資源的URL。

202 Accepted (已接受): 用于異步任務。服務器已接收請求,但尚未處理完成。這并不保證最終任務會成功。適用于需要長時間處理的操作,如視頻轉碼、生成報表等。客戶端可以后續通過輪詢或其他機制查詢任務狀態。

204 No Content (無內容): 服務器成功處理了請求,但響應體中沒有任何內容返回。常用于DELETE請求成功后,或PUT更新操作成功但無需返回資源內容時。

206 Partial Content (部分內容):(不常用) 用于范圍請求(Range Requests),表示服務器成功返回了資源的一部分,例如視頻流或大文件分塊下載。

3xx - 重定向 (Redirection)

表示客戶端需要執行后續操作才能完成請求。

301 Moved Permanently (永久移動): 請求的資源已被永久移動到新的URL。搜索引擎會更新其索引。API客戶端應該將本地書簽也更新到新的URL。

302 Found (找到):請求的資源臨時位于不同的URL。客戶端應該使用這個臨時的URL來發送本次請求,但下次還應該使用原始URL。常用于傳統的Web頁面重定向,API中較少使用。

303 See Other (查看其他):(與302類似但更明確) 建議客戶端使用GET方法去請求另一個URL來獲取結果。主要用于POST請求后,防止用戶刷新頁面導致重復提交。

304 Not Modified (未修改)用于緩存控制。當客戶端發送一個帶條件的GET請求(如使用If-None-Match或If-Modified-Since頭),如果服務器發現資源自上次請求以來未發生變化,則返回此碼,并且不包含響應體,從而節省帶寬。

307 Temporary Redirect (臨時重定向):(與302類似但更嚴格) 要求客戶端在重定向到新URL時,保持原始請求方法不變。例如,如果原始請求是POST,那么對新URL的請求也必須是POST。

4xx - 客戶端錯誤 (Client Error)

API設計中最需要關注和細化的一類,表示錯誤源于客戶端。

400 Bad Request (錯誤請求)通用的客戶端錯誤。表示服務器因客戶端發送的請求語法錯誤而無法解析。最常見的用途是參數驗證失敗,如缺少必需字段、字段格式錯誤、數值超出范圍等。

401 Unauthorized (未授權)用戶未認證。客戶端必須先進行身份驗證(例如,提供有效的Token或API Key)才能訪問該資源。它表達的是“你是誰?”的問題。

403 Forbidden (禁止訪問)用戶沒權限。服務器已經知道客戶端的身份,但該身份沒有權限訪問此資源。它表達的是“我知道你是誰,但你不能做這個操作”的問題。

404 Not Found (未找到):請求的資源不存在。例如,GET /api/users/9999,但ID為9999的用戶不存在。

405 Method Not Allowed (方法不允許):客戶端使用了當前資源不支持的HTTP方法。例如,對一個只讀資源使用POST。服務器應在Allow頭中返回支持的方法列表。

406 Not Acceptable (不可接受):(不常用) 服務器無法根據客戶端請求頭中的Accept字段(如Accept: application/xml)生成任何可接受的表示形式。

409 Conflict (沖突):請求的操作與服務器資源的當前狀態發生沖突。最常見的例子是嘗試創建一個已經存在的唯一資源(如注冊一個已被占用的用戶名或郵箱)。

410 Gone (已移除):(比404更明確) 請求的資源曾經存在,但現在已被永久刪除,并且不會再可用。

413 Payload Too Large (負載過大):客戶端發送的請求體大小超過了服務器的限制。

415 Unsupported Media Type (不支持的媒體類型):客戶端發送的請求體使用了服務器不支持的媒體類型(由Content-Type頭指定)。例如,API只接受application/json,但客戶端發送了application/xml。

422 Unprocessable Entity (無法處理的實體):(WebDAV擴展,但被廣泛用于API) 請求的語法正確,但語義錯誤,導致服務器無法處理。這是400的一個更具體的版本,專門用于業務邏輯層面的驗證失敗。

429 Too Many Requests (請求過多)API限流。客戶端在單位時間內發送的請求數量超過了服務器設定的速率限制。

5xx - 服務器錯誤 (Server Error)

表示錯誤源于服務器端,客戶端通常無法解決。

500 Internal Server Error (服務器內部錯誤)通用的服務器端錯誤。表示服務器遇到了一個未知的、無法處理的意外情況,例如代碼中出現未捕獲的異常、數據庫連接問題等。絕不能在響應中暴露敏感的錯誤細節

501 Not Implemented (未實現):服務器不支持當前請求所需要的功能。例如,客戶端使用了服務器無法識別的請求方法。

502 Bad Gateway (錯誤網關):作為網關或代理的服務器,從其上游服務器(如應用服務器)處收到了無效的響應。

503 Service Unavailable (服務不可用):服務器當前無法處理請求,通常是臨時性的。原因可能是服務器過載、正在進行維護或部署。服務器可以在Retry-After頭中告知客戶端何時可以重試。

504 Gateway Timeout (網關超時):作為網關或代理的服務器,未能及時從其上游服務器獲得響應。

HTTP 狀態碼速查表

類別狀態碼名稱核心適用場景
信息性響應(1xx)100 Continue繼續交互是否繼續發送
101 Switching Protocols切換協議切換協議
102 Processing處理中防止客戶端超時。請求包含多個子操作,需要較長時間
成功 (2xx)200 OK成功通用成功。GET, PUT, PATCH, POST(不創建新資源), DELETE 成功
201 Created已創建資源創建成功 (專用于POST)
202 Accepted已接受異步任務,請求已接收,正在后臺處理
204 No Content無內容成功處理,但無返回內容 (如DELETE成功)
206 Partial Content部分內容服務器成功返回了資源的一部分,例如視頻流或大文件分塊下載
重定向 (3xx)301 Moved Permanently永久移動資源 URL 永久變更
302 Found找到請求的資源臨時位于不同的URL
303 See Other查看其他建議客戶端使用GET方法去請求另一個URL來獲取結果
304 Not Modified未修改緩存命中,資源無變化
307 Temporary Redirect臨時重定向要求客戶端在重定向到新URL時,保持原始請求方法不變
客戶端錯誤 (4xx)400 Bad Request錯誤請求參數驗證失敗 (通用客戶端錯誤)
401 Unauthorized未授權需要認證 (未登錄或Token無效)
403 Forbidden禁止訪問權限不足 (已登錄但無權操作)
404 Not Found未找到請求的資源不存在
405 Method Not Allowed方法不允許HTTP 請求方法錯誤 (如對只讀資源用POST)
406 Not Acceptable不可接受服務器無法根據客戶端請求頭中的Accept字段生成任何可接受的表示形式
409 Conflict沖突資源狀態沖突 (如創建已存在的用戶)
410 Gone已移除請求的資源曾經存在,但現在已被永久刪除,并且不會再可用
413 Payload Too Large負載過大客戶端發送的請求體大小超過了服務器的限制
415 Unsupported Media Type不支持的媒體類型客戶端發送的請求體使用了服務器不支持的媒體類型(由Content-Type頭指定)
422 Unprocessable Entity無法處理的實體請求的語法正確,但業務語義錯誤 (400的更具體版本),專用于業務邏輯層面的驗證失敗
429 Too Many Requests請求過多API 限流
服務器錯誤 (5xx)500 Internal Server Error服務器內部錯誤通用服務器端代碼/環境異常
501 Not Implemented未實現服務器不支持當前請求所需要的功能
502 Bad Gateway錯誤網關網關/代理從上游收到無效響應
503 Service Unavailable服務不可用服務器臨時過載、維護或部署
504 Gateway Timeout網關超時網關/代理從上游請求超時

參考以及更多更詳細的狀態碼查詢

權威標準-IETF RFCs

RFC 7231: Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content: 6. Response Status Codes

RFC 6585: Additional HTTP Status Codes

RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)

開發者圣經-MDN Web Docs

HTTP 響應狀態碼 - HTTP | MDN

快速查詢

HTTP Status Codes Glossary - WebFX

趣味記憶

HTTP Cats

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從防抖節流到鏈表樹:編程世界中的抽象優化藝術

從防抖節流到鏈表樹:編程世界中的抽象優化藝術 在編程的知識體系中,有些概念看似毫不相關,卻在底層邏輯上有著驚人的相似之處。防抖與節流、鏈表與樹,這兩組分屬不同領域的概念,正是這種思維共性的典型代表。它們不僅展…

第三階段數據-3:數據庫腳本生成,備份與還原,分離與附加

1_生成數據庫腳本(1)在數據庫上右鍵選擇任務(2)選擇生成腳本(3)選擇下一步,如果下次不想顯示此頁面,可勾選不再顯示此頁(4)如果導出全部數據,選擇…

React框架超詳細入門到實戰項目演練【前端】【React】

React框架 1.前端展示解釋 當客戶端訪問服務器時,會從服務器中下載很多靜態文件到本地,比如css、js等前端渲染文件 下載完成之后瀏覽器會將這些文件組合形成前端頁面渲染出來。 2.React概述 React是一個專注于構建用戶界面的JavaScript庫,…

本地部署的終極多面手:Qwen2.5-Omni-3B,視頻剪、音頻混、圖像生、文本寫全搞定

Qwen2.5-Omni-3B是什么? Qwen2.5-Omni-3B 是由阿里巴巴 Qwen 團隊推出的一款輕量級多模態大模型,作為 Qwen2.5-Omni-7B 的高效優化版本,專為消費級硬件環境量身打造。該模型具備處理文本、音頻、圖像和視頻等多種模態輸入的能力,…

連續空間強化學習:策略輸出的兩種形態 —— 概率分布與確定性動作

在強化學習的世界里,智能體與環境的交互核心是 “動作選擇”。當面對離散動作空間(如圍棋的落子點、游戲的按鍵操作)時,智能體可以直接枚舉或概率選擇有限的動作;但在連續動作空間中(如機器人關節角度、無人…

IT運維背鍋權限泄露?集中式管控如何化解風險?

在企業數字化轉型的浪潮中,IT運維團隊常常被推到風口浪尖。員工離職后權限未及時回收、賬號共享導致數據泄露、跨系統權限配置不一致……這些問題一旦暴露,IT運維往往成為“背鍋俠”。權限泄露不僅威脅企業數據安全,還可能導致合規性風險&…

2025 世界機器人大會啟示錄:機構學 × AI × 視頻鏈路的融合之路

引言 2025 年 8 月 8 日,北京再一次成為全球矚目的科技焦點——世界機器人大會盛大開幕。來自全球的 200 余家頂尖企業齊聚一堂,帶來超過 1500 件展品,其中首發新品突破 100 款,涵蓋了從工業制造、醫療康復到服務陪伴、特種作業的…

從零開始部署經典開源項目管理系統最新版redmine6-Linux Debian12

安裝Debian 12 前面為了在windows上好開發,想要在windows上配置開發環境,以源碼方式在本地部署運行,但經過好幾天各種版本切換及配置組件庫等各種操作后,證明windows上搭建redmine6支持的運行環境沒有那么簡單,后續有…

超長視頻生成新突破!LongVie框架問世,創作不再受時長限制

超長視頻生成新突破!LongVie框架問世,創作不再受時長限制 文章來源:Poixe AI 在AI技術飛速發展的當下,視頻生成領域取得了令人矚目的進步,尤其是在短視頻創作方面。然而,當視頻時長超過一分鐘時&#xff…

MongoDB 查詢方法與高級查詢表(Python版)

目錄 一、MongoDB3步快速安裝 1.1?下載安裝包 1.2運行安裝程序? 1.3?驗證安裝?打開CMD執行: 1.4 基本查詢操作 二、高級查詢操作符表 2.1 比較操作符 2.2 邏輯操作符 2.3 元素操作符 2.4 數組操作符 三、高級查詢案例 3.1 復雜條件組合 3.2 數組查…

選型指南:如何為企業挑選合適的邊緣計算網關

選型指南:如何為企業挑選合適的邊緣計算網關在企業邁向智能化轉型的道路上,選擇一款合適的物聯網邊緣計算網關至關重要。面對眾多型號和功能各異的網關產品,企業該如何做出正確抉擇呢??首先要考慮的是網關的兼容性。藍蜂物聯網邊…

HT8693 音頻功率放大器:賦能優質音頻體驗的核心之選

在音頻設備快速迭代的當下,用戶對音質表現、設備穩定性和場景適應性的需求日益提升,一款性能卓越的音頻功率放大器成為連接音源與聽覺享受的關鍵橋梁。HT8693 憑借雙模式切換、強勁輸出、智能保護等核心優勢,為各類音頻設備提供了可靠的性能支…

python+flask后端開發~項目實戰 | 博客問答項目--模塊化文件架構的基礎搭建

項目功能概述: 首頁(公開博客顯示)博客發布與查詢用戶登錄與注冊底層MySQL數據庫的動態響應與支持 簡介:Flask作為Python的一個輕量級Web框架,以其靈活性和可擴展性,贏得了眾多開發者的青睞。從本文開始,你將從0開始…

精品方案 | GCKontrol與OMNeT++聯合仿真在機載網絡性能分析中的應用

概述本文基于GCKontrol搭建了飛行仿真模型,并基于OMNeT搭建了機內網絡系統,實現了不同專業、不同平臺的模型集成與調試。通過這種聯合仿真架構,能夠模擬飛機在不同飛行狀態下的網絡性能,極大提高了性能評估的精度和可靠性。這不僅…

階躍星辰 StepFun 入駐 GitCode 平臺,帶來工業級 AI 體驗

在 2025 年的 AI 產業應用實踐中,開發者面臨三重核心挑戰:???上下文窗口局限?:主流 AI 模型普遍受限于 4K-32K 的上下文長度,導致技術方案文檔需被強制拆分處理,破壞架構設計的連貫性。 ???跨行業文檔識別缺陷?…

亞馬遜新品爆單策略:從傳統困境到智能突破

新品上架,是每個亞馬遜賣家最期待又最煎熬的階段。我至今記得一款新品上線后的第一周:每天看著廣告費像流水一樣燒掉,單量卻遲遲不見起色。后臺的ACOS一路飆升,幾天時間,我的預算已經消耗了一大半。那種“錢花了&#…

第7章 React性能優化核心

性能優化是React開發中的重要主題,直接影響用戶體驗和應用成功。本章將深入探討React性能優化的核心技術和最佳實踐,從組件記憶化到Bundle優化,幫你掌握構建高性能React應用的關鍵技能。 通過本章學習,你將掌握如何識別性能瓶頸、選擇合適的優化策略,以及在實際項目中應用…

docker CI操作演示分享(第四期)

引言java項目:1、將項目通過maven進行編譯打包2、將文件上傳到指定的服務器中3、將war包放到tomcat的目錄中4、通過Dockerfile將tomcat和war包轉成一個鏡像,由docker-compose去運行容器項目更新后:將上述流程再次的從頭到尾的執行一次go項目&…

Kubernetes 的 YAML 配置文件-kind

Kubernetes的YAML配置文件–kind 在 Kubernetes 的 YAML 配置文件中,kind: 字段用于指定你要創建的資源對象類型。Kubernetes 支持多種資源類型,它們可以分為以下幾大類: 一、核心資源類型(常用) 1. Pod 描述:最小的部署單元,包含一個或多個容器。 特點:臨時性(Pod …

Tumblr長文運營:亞矩陣云手機助力多賬號輪詢與關鍵詞布局系統

——基于硬件虛擬化與AI語義分析的垂直內容滲透方案?一、技術架構:長文運營的三大核心引擎??多賬號輪詢系統??虛擬設備集群?:基于ARM服務器虛擬化技術(如亞矩陣RK3588芯片),單臺物理服務器可模擬500獨立Tumblr客…