写点什么

四、《图解 HTTP》- 状态码

作者:懒时小窝
  • 2022 年 8 月 12 日
    广东
  • 本文字数:5204 字

    阅读完需:约 17 分钟

四、《图解HTTP》- 状态码

#tjhttp 四、《图解 HTTP》- 状态码

状态码章节内容过于贫乏,参考资料找了一个澳大利亚的博客,里面收录了 HTTP 的状态码介绍,为什么选这个作参考?一个是网站挺漂亮,另一个是做了一张长图容纳了常见的响应码,存到手机可以时不时看看,并且博客有做国际化,点进去自动就是中文(但是团队确实是外国人),挺有意思的。


另外需要注意汇总图是英文的,为了不丢失 HTTP 状态码的本意,建议先翻一翻 RFC 协议原文是如何定义的,通过网络查找国内几个点击率很高的比如菜鸟教程对比理解,个人并不建议完全看中文了解状态码含义,英文原文更加贴合定义本义同时里面还有一些小细节。


《图解 HTTP》所介绍的 HTTP1.1 版本均为 RFC 2616 的描述,很多内容其实已经过时或者直接废弃了!切记!


互联网的一手信息基本都是英文的,编程学习的深入总有一天要直面纯英文。

知识点

  1. 状态码定义的 IETF 协议规范,使用 RFC 7231 作为协议参考。

  2. 常见状态码定义,以及在 RFC 7231 中的协议定义参考

  3. 如何选择合适的状态码,这里仅介绍了 GET/POST/HEAD 三个最常用的状态码定义参考。

注意事项

查看具体内容之前,我们需要了解最早的正式 HTTP1.1 协议版本公认为 RFC 2616,但是后续出现了更多的修订版,补充了更多有关响应码和完善细节,比如现在的 HTTP1.1 早就是 RFC 723X 开头了。


另外为了方便读者了解协议原文,每一个大标题做了超链接,可以直接点击标题访问当前最新的协议网站。(部分博客平台 markdown 解析可能没法点击,在每一个标题开头也给了链接)


从协议发布节点来看,2014 年的 RFC723X 开头的协议可以认为是 HTTP1.1 的最后的更新版本。


本文介绍的状态码在 RFC2616 很多都是没定义的,RFC2616 很老了早就已经废弃了!


具体的内容见:


  • RFC2068:https://tools.ietf.org/html/rfc2068:过时的

  • RFC2616: https://tools.ietf.org/html/rfc2616:过时的

  • RFC7230: https://tools.ietf.org/html/rfc7230

  • RFC7231:https://tools.ietf.org/html/rfc7231

  • RFC7232: https://tools.ietf.org/html/rfc7232

  • RFC7233: https://tools.ietf.org/html/rfc7233

  • RFC7234: https://tools.ietf.org/html/rfc7234

  • RFC7235: https://tools.ietf.org/html/rfc7235

  • RFC7230:语法和路由

  • 语法:描述了一个 HTTP 请求或者响应长什么样。即第一行写什么怎么写、第二行写什么怎么写...

  • 路由:资源标识(URI)如何确定?通过什么方式获取到想要的内容?是直接从本地缓存获取?还是通过代理(Proxy)获取?还是直接请求?

  • RFC7231:语义和内容(最需要关注的内容,RESTful-like)

  • 各种请求方法(GET、POST、DELETE 等等)和请求头(Expect、Accept-Language、User-Agent 等等)表达了什么意图?

  • 响应体的状态(200 OK、201 Created、403 Forbidden 等等)和响应头(Location、Retry-After、Allow 等等)表达什么意思?

  • RFC7232:条件请求

  • 响应体告知客户端某些数据条件(Last-Modified、ETag 等等),客户端可以在下次请求的时候带上这些信息(If-Modified-Since、If-Match 等等)。在符合条件或者不符合条件的情况下,服务端应该如何处理;

  • RFC7233:范围请求

  • 由于各种因素而只得到部分响应的时候,发起范围请求以获取剩下的内容,避免从头请求而浪费资源;

  • RFC7234:缓存

  • 通过减少请求避免网络资源的浪费;

  • RFC7235:认证

  • 用户认证。Basic Auth、Token 等等。

4.1 状态码定义

  • 1XX:1XX 开头多为信息提示信息,几乎看不到使用场景,忽略即可。此外 1XX 的状态码并不会影响到 SEO 优化。

  • 2XX: HTTP 状态代码是成功请求。 比如 HTTP 200 OK 成功状态响应代码指示请求已成功。

  • 3XX:HTTP 状态代码指示重定向。 最常见的 3XX HTTP 状态代码包括“ 301 永久移动”,“找到 302”和“ 307 临时重定向” HTTP 状态代码。

  • 4XX 状态代码是客户端错误。 最常见的 4xx 状态代码是“ 404 未找到”和“ 410 消失” HTTP 状态代码。

  • 5XX HTTP 状态代码是服务器错误。 最常见的 5xx HTTP 状态代码是“ 503 服务不可用”状态代码。

常见状态码定义

1XX 请求几乎用不到,不需要了解,这里跳过。

4.1.1 2XX:请求成功

HTTP1.1 协议原文:


https://datatracker.ietf.org/doc/html/rfc7231#section-6.3


  • 200 OK:请求成功。

  • 201 Created:服务器确认创建的资源。 

  • 202 Accepted:客户端的请求已经收到请求,但服务器仍在处理它。

  • 203 Non-Authoritative Information:服务器发送给客户端的响应与服务器发送时的响应不同。

  • 204 No Content:服务器处理了请求但未提供任何内容。

  • 205 Reset Content:客户端应该刷新文档样本。

  • 206 Partial Content:服务器仅发送资源的一部分。

  • 207 Multi-Status:默认情况下,消息正文是 XML 消息,可以包含多个单独的响应代码。


案例:在此示例中,尝试删除 http://www.example.com/container/resource3 失败,因为资源被锁定了。


  >>Response
HTTP/1.1 207 Multi-Status Content-Type: application/xml; charset="utf-8" Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <d:multistatus xmlns:d="DAV:"> <d:response> <d:href>http://www.example.com/container/resource3</d:href> <d:status>HTTP/1.1 423 Locked</d:status> <d:error><d:lock-token-submitted/></d:error> </d:response> </d:multistatus>
复制代码


  • 208 已报告:a 的成员 WebDAV的 绑定已经在(多状态 )响应的前一部分中被枚举,并且不再被包括在内。


WebDAV:是一个数字信息管理系统。 它是一个管理和共享在线文件的平台,非常适合在线应用程序和社交网站。 WebDAV 允许存储、管理和与其他 Web 用户共享更新和文件。 还可以在计算机和设备之间共享文件。

4.1.2 3XX:重定向

HTTP1.1 协议原文:


https://datatracker.ietf.org/doc/html/rfc7231#section-6.4


如果用户访问到 3XX 开头的代码,则会被浏览器重定向到不同的 URL。注意这种返回码对于 SEO 优化影响比较大。


注意:当且仅当第二个请求中使用的方法是 GET 或 HEAD。客户端应该检测无限重定向循环,因为这样的循环会为每个重定向生成网络流量。


在规范当中建议重定向次数最多不超过 5 次。


下面是一些常见的 3XX 状态码。


  • 300 多项选择:客户端发出的请求有多种可能的响应。

  • 301 永久移动:服务器告诉客户端他们寻找的资源已被永久移动到另一个 URL。 所有用户和机器人都将被重定向到新的 URL。 这是 SEO 的一个非常重要的状态代码。

  • 302 临时转移:网站或页面资源已暂时移至不同的 URL。 这是另一个与 SEO 相关的状态代码。另外收到 302 和 301 的时候不允许客户端改变重定向请求方法。另外服务端通常会把 302 请求当做是 303 进行响应,对于 Location 字段发起 GET 请求。(SEO 优化)只有在 Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。

  • 303 查看其他:此代码告诉客户端服务器不是将它们重定向到请求的资源,而是重定向到另一个页面。

  • 304 Not Modified:请求的资源自上次传输后没有改变。如果使用强缓存校验器,则响应不能包含实体标头,如果 304 响应没有指示条件情况下则进行重复请求,如果 304 响应包含缓存条目,则同样需要按照缓存条目更新到本地。

  • 305 使用代理:客户端只能通过响应中提供的代理访问请求的资源。305 请求必须生成自原始服务器。(已废弃)

  • 307 临时重定向:服务器告诉客户端他们寻找的资源已经被临时重定向到另一个 URL。 它与 SEO 性能有关。除非请求方法是 HEAD,否则响应应该包含一个带有超链接的简短超文本注释。

  • 308 永久重定向:服务器告诉客户端他们寻找的资源已经被临时重定向到另一个 URL。

4.1.3 4XX:客户端错误

HTTP1.1 协议原文:


https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1


  • 400 错误请求:客户端发送的请求包含不完整的数据、构造不良的数据或无效的数据。

  • 401 未授权:客户端访问请求的资源需要授权。响应内容中需要包含 www-Authnticate 头信息和询问信息,如果已经存在证书访问还是 401 说明证书已经不被接受,如果 401 和前一个身份验证请求相同,并且浏览器进行了至少一次重试,则浏览器应该展示响应包含的实体信息(也就是诊断信息)。

  • 403 Forbidden:客户端尝试访问的资源被禁止。和 401 的区别是不提供任何身份认证的帮助,也不允许重复提交,服务端有义务声明不能访问的理由。

  • 404 未找到:服务器可访问,但客户端查找的特定页面不可访问或者资源不存在。服务可以利用这个状态码暴露自己服务存在的同时不想暴露“资源存在”。

  • 405 Method Not Allowed:服务器已接收并识别请求,但拒绝了特定的请求方法。该响应必须返回一个 Allow 头信息用以表示出当前资源能够接受的请求方法的列表。对于一些修改服务器资源数据的请求方法比如 PUT 和 DELETE 通常不被允许。

  • 406 不可接受:网站或 Web 应用程序不支持具有特定协议的客户端请求。请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。

  • 407 需要代理身份验证:此状态代码类似于 401 未授权。 唯一的区别是授权需要由代理完成。

  • 408 请求超时:客户端向网站服务器发送的请求已过期。客户端可以随时再次提交这一请求而无需进行任何更改。

  • 409 冲突:发送的请求与服务器的内部操作发生冲突。注意只有在客户端具备自身处理能力,比如重新提交请求的前提下才能返回此状态码,响应信息中也需要提供冲突的源头内容。此外 冲突通常会发生在 PUT 请求当中,在使用版本检查的情况下,如果某次请求附带的版本信息和之前的内容冲突,就会返回此响应码。

  • 410 Gone:客户端想要访问的资源已被永久删除。主要用于服务端想要删除某个资源并且告知用户此资源不再接受访问的一种提示。注意这个状态码很像 404,最大的区别是资源是否永久不存在


不常见的 HTTP 4XX 状态码


用的比较少,遇到了再来查询即可。


  • 402 需要付款

  • 412 失败预处理

  • 415 不支持的媒体类型

  • 416 请求的范围不满足。请求的 Range 标头字段中没有一个范围与所选资源的当前范围重叠,或者由于无效范围或对小范围或重叠范围的请求过多而拒绝了请求的范围集。

  • 417 期望失败

  • 422 不可处理的实体

  • 423 锁定

  • 424 失败的依赖

  • 426 需要升级

  • 429 请求过多

  • 431 请求头字段太大

  • 451 因法律原因不可用

4.1.4 5XX:服务端错误

HTTP1.1 协议原文:


https://datatracker.ietf.org/doc/html/rfc7231#section-6.6.1


5XX 开头的状态码通常为服务器错误,表明客户端发送的请求没有问题,但是服务器不能正常处理请求。


  • 500 内部服务器错误:服务器在处理客户端请求时遇到无法处理的情况。注意这是一个笼统的错误,并不知道错误的具体原因。

  • 501 未实现:服务器不知道或无法解析客户端发送的请求方法。

  • 502 错误网关:服务器充当网关或代理并从入站服务器收到无效消息。

  • 503 服务不可用: 服务器可能已关闭 并且无法处理客户的请求。 此 HTTP 状态代码是您在 Web 上可能遇到的最常见的服务器问题之一。

  • 511 需要网络身份验证:客户端需要在网络上进行身份验证才能访问资源。


其他不太常见的 5XX HTTP 状态代码包括:


  • 504 网关超时:服务器充当网关或者代理的时候,没有收到响应。和 408 的区别是 408 是服务端接受客户端超时,504 是代理接收服务端超时。

  • 505 不支持 HTTP 版本,服务器不支持或拒绝支持 HTTP 协议,表示服务器无法处理或者不愿意处理。

  • 506  Variant Also Negotiates:服务器有一个内部配置错误,选择变体资源配置为主机参与透明内容协商,表明当前服务器不是适当的透明协商节点,无法处理。

  • 507 存储空间不足:当前服务器无法处理资源请求。可以认为是一种临时情况。

  • 508 检测到环路:服务器终止了操作,因为它在处理具有“深度:无穷大”的请求时遇到了无限循环。 此状态表示整个操作失败。

  • 510 未扩展:请求中未满足访问资源的策略。服务器应发回客户端发出扩展请求所需的所有信息。

4.2 选择合适的状态码定义

下面根据状态码介绍,了解如何为方法设置合适的状态码定义。实际上项目中接口更多使用一套自定义的规则去响应,而不是用 HTTP 自身定义的一些 Code。


这部分内容同样只记录了常见请求的,其他请求使用概率通常比较小。


GET/HEAD/POST


最常见的状态定义:


  • 201 Created:服务器确认创建的资源。 

  • 206 Partial Content:服务器仅发送资源的一部分。

  • 303 查看其他:此代码告诉客户端服务器不是将它们重定向到请求的资源,而是重定向到另一个页面。

  • 304 Not Modified:请求的资源自上次传输后没有改变。如果使用强缓存校验器,则响应不能包含实体标头,如果 304 响应没用指示条件情况下则进行重复请求,如果 304 响应包含缓存条目,则同样需要按照缓存条目更新到本地。

  • 416  请求的范围不满足。请求的 Range 标头字段中没有一个范围与所选资源的当前范围重叠,或者由于无效范围或对小范围或重叠范围的请求过多而拒绝了请求的范围集。 注意:由于服务器可以自由地忽略 Range,因此许多实现将简单地以 200 OK 响应中的整个选定表示形式进行响应。


案例:


HTTP/1.1 416 Range Not SatisfiableDate: Fri, 20 Jan 2012 15:41:54 GMTContent-Range: bytes */47022
复制代码


用户头像

懒时小窝

关注

赐他一块白石,石头上写着新名 2020.09.23 加入

如果我们想要知道自己想要做什么,必须先找到自己的白色石头。欢迎关注个人公众号“懒时小窝”,不传播焦虑,只分享和思考有价值的内容。

评论

发布
暂无评论
四、《图解HTTP》- 状态码_HTTP_懒时小窝_InfoQ写作社区