告别笼统的 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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客…