选择一个 HTTP 状态码不再是一件难事 – Racksburg《转载》

本文转载自:众成翻译 译者:十年踪迹 链接:http://www.zcfy.cc/article/904 原文:http://racksburg.com/choosing-an-http-status-code/

有什么能比 HTTP 响应状态码更简单呢?页面渲染了吗?好极了,返回 200。页面不存在?那么是 404。想要跳转到另一个页面?302 或者可能是 301

我喜欢把 HTTP 状态码想象成无线电波传输的 10 码<sup>1</sup>。“呼叫,呼叫,我是 White Chocolate Thunder,发现 200 OK。”

—— Aaron Patterson (@tenderlove) 2015-10-7

<!–more–>

生活是美好的……直到有人告诉你,你还没有做这个 REST<sup>2</sup>。然后你该失眠了,因为你需了解是否你的新资源返回符合 RFC 规范<sup>3</sup>,Roy-Fielding 规定的状态码。这里只有 200 吗?或者为什么没有 204 No Content?或许有 202 Accepted……或者有 201 Created

使事情复杂化的是,官方的 HTTP/1.1 指南 —— RFC —— 是写于 1997 年的。† 在那一年,人们还在使用 Netscape 浏览器以 33.6 KB 的调制解调器来上网。在现在用 HTTP/1.1 就有点像把孙子兵法运用于现代企业战略,兵法无疑是伟大的,但我根本不知道如何具体运用。

能不能有一种直观的决策树来让你快速确定你要用到的少数状态码,并将那些不相关的和废弃的状态码排除掉?

当然可以,现在就能给你一个。

从何说起

它可能看起来很可笑,但是我曾经看到过太多人分不清这些,“这里应该用 503 Service Unavaliable 还是 404 Not Found?”如果你曾经在这上面犹豫,那么你完全弄混了不同的响应类型,你的做法完全是错的。你应该回头看看上面这张流程图。

在深入到具体规范的流程图之前,有一些注意事项:

  • 我建议你阅读 RFC 7231httpstatuses.com
  • 以下内容对开发网站和设计 RESTish API 有用。
    • 状态码对具体的 web server 实现是完全透明的
    • 当然这里完全忽略代理服务器
  • 我将响应状态码粗略地归为三类:

最后但同样重要的,免责声明:我不保证我写的完全正确,我只是读了一些 RFC 文档在 Racksurg 公司实际工作时,每天用它来实现有用的 API。如果你认为我是错的或者我轻视了你最喜欢的状态码,那可能是我的失误,你可以通过评论告知我究竟错在哪里。

2XX/3XX

4XX

5XX

结语:究竟为什么状态码重要

我并不完全确定它们真的重要。

Facebook 上有许多聪明人,他们创建了 API 只返回 200

反对挑选指定状态码的基本观点是:现有的状态码对于现代网站/API来说太通用了。它无法让客户端以任何一种有意义的方式处理包含特定应用格式的细节的返回信息 —— 例如表单的哪一个字段校验失败了以及为什么失败了。既然如此,那么为什么要在多余的没什么用的 HTTP 状态码上浪费时间?

如果要给出一个理由,来说明为什么使用特定的状态码很重要,公认的理由是 HTTP 是一个分层的系统,如果响应状态码是有特定含义的,任何代理、缓存或者位于客户端和服务器之间的 HTTP 框架能够更好地工作。我不认为这个理由足够更令人信服,尤其现在每个人都开始将服务迁移到 HTTPS,我们禁止了任何不被服务器直接控制的代理或缓存节点。

然而,我会给你三个理由为什么我认为状态码仍然很重要:

  1. 客户端已经处理(或者可以方便地被扩展以便处理)具有特定行为的不同状态码:

    • 相比于 302 Found301 Moved Permanently 在 Google 等搜索引擎上有更好的 SEO 效果。
    • 301 Moved Permanently 能够被缓存,而 429 Too Many Requests 不被缓存等等。 有的客户端库可以处理 429 Too Many Request,将请求回退并一天之后再次尝试请求。 有的客户端可以用同样的方式处理 503 Service Unavilable
  2. 即使对现代需求不能完全满足,许多状态码依然代表着值得处理的特定响应(因此为什么不直接使用标准状态码?)。
    • 那些本该返回 405 Method Not Allowed 却返回 404 的 API 让我疯狂地想,“究竟我是敲错了 URL 还是用错误的 HTTP method 请求了服务?”
    • 我能告诉你如果我们返回 502 Bad Gateway(上游服务问题)而不是返回让人困惑的 500 Internal Server Error,那么我们曾经能节省许多调试问题的时间。
  3. 不管你信不信,反正我是信了,在广泛被使用的 API 中正在建立一个约定,以返回状态码例如 201 Created429 Too Many Requests 以及 503 Service Unavialable。如果你遵循这个约定,用户将能更方便地使用你的网站/API并且解决任何他们可能遇到的问题。

在这里面,决定什么时候返回何种状态码是最难的,然而有了正确的知识(别再说我不知道,仔细看前面的流程图),挑选一个有意义的状态码变得简单很多。

说明

别去研究 RFC 2616,更别去研究 RFC 2068,真正有用的是 RFC 7231

参考资料

  • 注<sup>1</sup>:10码,又称十个信号,用来表示常用的短语,在语音通信,特别是执法和公民波段(CB)无线电传输码字。
  • 注<sup>2</sup>:表述性状态转移:REST
  • 注<sup>3</sup>:Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。
时间: 2024-11-06 12:19:45

选择一个 HTTP 状态码不再是一件难事 – Racksburg《转载》的相关文章

选择一个 HTTP 状态码不再是一件难事 – Racksburg

原文链接:http://racksburg.com/choosing-an-http-status-code/ 打开双语对照阅读 有什么能比 HTTP 响应状态码更简单呢?页面渲染了吗?好极了,返回 200.页面不存在?那么是 404.想要跳转到另一个页面?302 或者可能是 301. 我喜欢把 HTTP 状态码想象成无线电波传输的 10 码1.“呼叫,呼叫,我是 White Chocolate Thunder,发现 200 OK.” —— Aaron Patterson (@tenderlov

如何选择正确的HTTP状态码

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/how-to-choose-http-status-code 众所周知,每一个HTTP响应都会带有一个状态码,不过对于很多开发者来说,平时使用最多的几个状态码无外乎就是200.400.404.500等.那其他众多状态码该应用在何种场景中,什么时候应该使用哪些状态码就成为一个值得我们深入思考的问题了.即便在Facebook这样的公司中,那些聪明的开发者所构建的API也可能

常见HTTP状态码

一些常见HTTP状态码为:200 – 服务器成功返回网页404 – 请求的网页不存在503 – 服务不可用 常见HTTP状态码大全 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明http状态码 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分.http状态码 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换. 2xx (成功)表示成功处理了请求的状态代码.代码 说明http状态码 200

PHP输出http状态码以及常用状态码

100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功 理解和接受. 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息. 400-499 用于指出客户端的错误. 500-599 用于支持服务器错误. [Informational 1xx]  信息化100="Continue" 继续:如果服务器收到头信息中带有100-continue的请求,这是指客户端询问是否可以在后续的请求中发送附件.在这种情况下,服务器用100(SC_CONT

HTTP状态码总结

众所周知,每一个HTTP响应都会带有一个HTTP状态码(HTTP Status Code),是用来表示HTTP服务器响应状态的代码.它由RFC 2616规范定义的,并得到RFC 2518.RFC 2817.RFC 2295.RFC 2774.RFC 4918等规范扩展.作为web开发者,平时经常200.301.302.404.500.503等.最近正在开发一些对外的接口(公司内部各系统间互相调用的接口,也算是内部Open API吧),接口调用失败时需要返回一些状态码,考虑借用HTTP状态码的含义

php 状态码

200 – 服务器成功返回网页 301 (永久移动) 请求的网页已永久移动到新位置. 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置. 403 (禁止) 服务器拒绝请求 404 – 请求的网页不存在 503 – 服务不可用 常见HTTP状态码大全 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 http状态码 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. http状

HTTP协议 (六) 状态码详解

HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫,机器人等程序.还是需要了解其他状态码.  本文我花了一个多月的时间把所有的状态码都总结了下,内容太多,看的时候麻烦耐心点了. HTTP状态码的学习资料到处都有,但是都是理论上讲解.  本文介绍HTTP协议中的HTTP状态码(HTTP Status Code), 会对大部分的状态码都进行了详细的实例讲

[RESTful]HTTP状态码

HTTP状态码是一个依附于HTTP响应的3位数字,它是协议语义的一部分,能在最基本的层面上让客户端知道服务器在尝试处理请求的时候发生了什么事情.HTTP规范总共定义了41一个响应码,本文将对所有的状态码进行介绍. 一.状态码家族 HTTP状态码的第一位数字是表明请求进展情况的一个非常通用的指示.HTTP规范使用1~5作为首数字分别定义了5个状态码家族. 1xx:Information 仅在HTTP客户端与服务器之间进行协商时使用. 2xx:Successful 客户端所要求的任意的状态码转换已经

HTTP状态码之302、303和307

今日读书,无法理解HTTP302.303.307状态码的来龙去脉,决定对其做深究并总结于本文. <HTTP权威指南>第3章在讲解30X状态码时,完全没有讲清楚为什么要有302.303.307的关系,一句“问题出在HTTP/1/1”让我一头雾水,莫名其妙:而第五章在讲重定向响应时,没有说到现在很常见的302,反而是说我从没遇到过的303和307.很是迷惑,对于这3个状态码,WiKi和RFC文档都有详解,下面我以我的思维添油加醋的描述一遍. 一.状态码——302 RFC1945(http://to