版权声明:本文为博主原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。
这可能是全网最全的HTTP状态码解释,强烈建议您收藏。
在前后端开发、服务器运维等场景中,经常需要处理网络请求。了解HTTP状态码,可以快速判断常见问题。
简介
定义
HTTP状态码(HTTP Status Code)是表示网页服务器超文本传输协议响应状态的3位数字代码。
作用过程
HTTP协议中,客户端发出请求连接、服务端建立连接,客户端发出HTTP请求,服务端返回响应信息。
而在这个过程中,由于客户端或服务端的问题会返回相应的错误代码,不同代码表示不同的信息,客户端可以根据编码、调整相应的操作来修改出现的错误,最终避免错误的再现
五种分类
所有状态码的第一个数字,代表了响应的五种状态。
状态码 | 描述 | 解释 |
---|---|---|
1xx | INFORMATIONAL 信息性 |
临时的响应,只包含状态行和某些可选的响应头信息,并以空行结束。 客户端在收到常规响应之前,应准备接收一个或多个1XX响应 |
2xx | SUCCESSFUL 成功 |
服务器成功接收客户端去哪个区,理解并接受 |
3xx | REDIRECTION 重定向 |
客户端必须采取进一步的措施才能完成请求。 * 例:浏览器可能不得不请求服务器上的不同页面,或者通过代理服务器重复该请求。 * 通常这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明 |
4xx | CLIENT_ERROR 客户端错误 |
客户端请求包含错误的语法或参数错误。 * 例:客户端请求不存在的页面,客户端未提供有效的身份验证信息 * 这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容 * 如果错误发生时,客户端正在传送数据,那么服务器关闭TCP连接前,应确保客户端收到了错误信息。如果客户端之后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端所有还未识别的输入缓冲,以免这些数据被服务器上的应用程序读取并干扰后者 |
5xx | SERVER_ERROR 服务器错误 |
服务器遇到错误而不能完成客户端有效请求,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。 除非这是一个HEAD 请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体 |
也可能会出现服务器没有返回状态码的情况,可能是网络问题、网站崩溃、客户端IP被封等。
状态码列表
Java开发中,可在
spring-web
包找到org.springframework.http.HttpStatus
类,查看每个状态码的描述,有助于理解该状态码的含义。
下面列出了所有的状态码,解释中已详细说明了各状态的用途。
有兴趣的可以查看官方说明1或下表的“协议标准”,对状态的来龙去脉和用途有非常详细的展开。百度词条2中也有对部分状态做了详细的解读,只是比较少。
状态码 | 描述 | 解释 | 协议标准 |
---|---|---|---|
100 | Continue(继续) | 服务器仅收到部分请求,但服务器并未拒绝该请求,客户端应继续发送其余的请求 | RFC7231, Section 6.2.1 |
101 | Switching Protocols | 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议 | RFC7231, Section 6.2.2 |
102 | Processing | 参考协议标准 | RFC2518 |
103 | Early Hints | 参考协议标准 | RFC8297 |
104-199 | Unassigned | ||
200 | OK(成功) | 请求响应体包含服务器返回的数据 | RFC7231, Section 6.3.1 |
201 | Created | 请求被创建完成,同时新的资源被创建 | RFC7231, Section 6.3.2 |
202 | Accepted | 服务器已接受请求,但是处理未完成 | RFC7231, Section 6.3.3 |
203 | Non-Authoritative Information | 文档已经正常地返回,但返回了可能来自另一来源的信息 | RFC7231, Section 6.3.4 |
204 | No Content | 请求收到,但返回信息为空。也表示没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的 | RFC7231, Section 6.3.5 |
205 | Reset Content | 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 | RFC7231, Section 6.3.6 |
206 | Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它 | RFC7233, Section 4.1 |
207 | Multi-Status | 参考协议标准 | RFC4918 |
208 | Already Reported | 参考协议标准 | RFC5842 |
209-225 | Unassigned | ||
226 | IM Used | 参考协议标准 | RFC3229 |
227-299 | Unassigned | ||
300 | Multiple Choices | 多重选择,返回链接列表。用户可以选择某链接到达目的地。最多允许五个地址 | RFC7231, Section 6.4.1 |
301 | Moved Permanently | 请求已永久转移到新地址。返回新地址。 | RFC7231, Section 6.4.2 |
302 | Found | 请求临时转移到新地址。返回新地址。 | RFC7231, Section 6.4.3 |
303 | See Other | 所请求的页面可在别的url下被找到,建议客户端访问其他URL | RFC7231, Section 6.4.4 |
304 | Not Modified | 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用 | RFC7232, Section 4.1 |
305 | Use Proxy | 客户端的请求应该通过Location头所指明的代理服务器提取 | RFC7231, Section 6.4.5 |
306 | (Unused) | 前一版本HTTP中使用的代码,现行版本中不再使用 | RFC7231, Section 6.4.6 |
307 | Temporary Redirect | 被请求的资源已经临时移至新的url | RFC7231, Section 6.4.7 |
308 | Permanent Redirect | 参考协议标准 | RFC7538 |
309-399 | Unassigned | ||
400 | Bad Request | 请求有错误,如语法错误导致服务器无法理解、或参数错误 | RFC7231, Section 6.5.1 |
401 | Unauthorized | 请求授权失败,需要进行用户认证。客户端可再次发起请求、并在请求头中提供一个包含认证证书、如会话跟踪cookie | RFC7235, Section 3.1 |
402 | Payment Required | 此代码尚无法使用 | RFC7231, Section 6.5.2 |
403 | Forbidden | 请求被禁止、超出访问权限。与401不同,请求已经通过了身份验证,只是没有获得资源授权 | RFC7231, Section 6.5.3 |
404 | Not Found | 服务器无法找到被请求的资源 | RFC7231, Section 6.5.4 |
405 | Method Not Allowed | 请求中指定的方法不被允许 | RFC7231, Section 6.5.5 |
406 | Not Acceptable | 服务器生成的响应无法被客户端所接受 | RFC7231, Section 6.5.6 |
407 | Proxy Authentication Required | 用户必须首先使用代理服务器进行验证,这样请求才会被处理 | RFC7235, Section 3.2 |
408 | Request Timeout | 请求超出了服务器的等待时间,客户端没有在指定时间内完成请求 | RFC7231, Section 6.5.7 |
409 | Conflict | 由于冲突,请求无法被完成 | RFC7231, Section 6.5.8 |
410 | Gone | 被请求的页面不可用 | RFC7231, Section 6.5.9 |
411 | Length Required | “Content-Length” 未被定义。如果无此内容,服务器不会接受请求 | RFC7231, Section 6.5.10 |
412 | Precondition Failed | 请求中的前提条件被服务器评估为失败 | RFC7232, Section 4.2 |
413 | Payload Too Large | 请求的资源大于服务器允许的大小,服务器不会接受请求 | RFC7231, Section 6.5.11 |
414 | URI Too Long | 请求的资源URL长于服务器允许的长度,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况 | RFC7231, Section 6.5.12 |
415 | Unsupported Media Type | 由于媒介类型不被支持,服务器不会接受请求 | RFC7231, Section 6.5.13 |
416 | Range Not Satisfiable | 服务器不能满足客户在请求中指定的Range头 | RFC7233, Section 4.4 |
417 | Expectation Failed | 服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求 | RFC7231, Section 6.5.14 |
418-420 | Unassigned | ||
421 | Misdirected Request | 从当前客户端所在的IP地址到服务器的连接数,超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户 | RFC7540, Section 9.1.2 |
422 | Unprocessable Entity | 请求格式正确,但是由于含有语义错误,无法响应 | RFC4918 |
423 | Locked | 当前资源被锁定 | RFC4918 |
424 | Failed Dependency | 由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH | RFC4918 |
425 | Too Early | 请求可能会重新发起,服务器不愿意冒重新处理请求的风险 | RFC8470 |
426 | Upgrade Required | 客户端应当切换到TLS/1.0 | RFC7231, Section 6.5.15 |
427 | Unassigned | ||
428 | Precondition Required | 参考协议标准 | RFC6585 |
429 | Too Many Requests | 参考协议标准 | RFC6585 |
430 | Unassigned | ||
431 | Request Header Fields Too Large | 参考协议标准 | RFC6585 |
432-450 | Unassigned | ||
451 | Unavailable For Legal Reasons | 参考协议标准 | RFC7725 |
452-499 | Unassigned | ||
500 | Internal Server Error | 请求未完成。服务器内部遇到不可预知的错误 | RFC7231, Section 6.6.1 |
501 | Not Implemented | 请求未完成。服务器不支持所请求的功能 | RFC7231, Section 6.6.2 |
502 | Bad Gateway | 请求未完成。服务器从上游服务器收到一个无效的响应,或有时是为了防止发生系统过载中断请求,如网关层发现服务端无响应、直接熔断 | RFC7231, Section 6.6.3 |
503 | Service Unavailable | 请求未完成。服务因压力过大或宕机导致不可用 | RFC7231, Section 6.6.4 |
504 | Gateway Timeout | 网关超时,可能是网关过载、或上游服务一直未响应 | RFC7231, Section 6.6.5 |
505 | HTTP Version Not Supported | 服务器不支持或拒绝支请求头中指定的HTTP版本 | RFC7231, Section 6.6.6 |
506 | Variant Also Negotiates | 由《透明内容协商协议》扩展,代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点 | RFC2295 |
507 | Insufficient Storage | 参考协议标准 | RFC4918 |
508 | Loop Detected | 参考协议标准 | RFC5842 |
509 | Unassigned | ||
510 | Not Extended | 参考协议标准 | RFC2774 |
511 | Network Authentication Required | 参考协议标准 | RFC6585 |
512-599 | Unassigned |
Web应用中的用法
在Restful接口开发中,响应状态一般固定为200,返回内容中增加返回状态编码、用于标识接口运行结果。
发生错误时,优先使用HTTP状态码(如校验未通过/会话超时为401、没有授权为403),不符合标准定义的错误才需要自行定义编码。
例1:status 200 body {“code”: 200, data: {}}
例2:status 200 body {“code”: 401, message: “未登录”}
以上。感谢您的阅读。