选择一个 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 7231 和 httpstatuses.com
- 以下内容对开发网站和设计 RESTish API 有用。
- 状态码对具体的 web server 实现是完全透明的
- 当然这里完全忽略代理服务器
- 我将响应状态码粗略地归为三类:
最后但同样重要的,免责声明:我不保证我写的完全正确,我只是读了一些 RFC 文档在 Racksurg 公司实际工作时,每天用它来实现有用的 API。如果你认为我是错的或者我轻视了你最喜欢的状态码,那可能是我的失误,你可以通过评论告知我究竟错在哪里。
2XX/3XX

4XX

5XX

结语:究竟为什么状态码重要
我并不完全确定它们真的重要。
Facebook 上有许多聪明人,他们创建了 API 只返回 200。
反对挑选指定状态码的基本观点是:现有的状态码对于现代网站/API来说太通用了。它无法让客户端以任何一种有意义的方式处理包含特定应用格式的细节的返回信息 —— 例如表单的哪一个字段校验失败了以及为什么失败了。既然如此,那么为什么要在多余的没什么用的 HTTP 状态码上浪费时间?
如果要给出一个理由,来说明为什么使用特定的状态码很重要,公认的理由是 HTTP 是一个分层的系统,如果响应状态码是有特定含义的,任何代理、缓存或者位于客户端和服务器之间的 HTTP 框架能够更好地工作。我不认为这个理由足够更令人信服,尤其现在每个人都开始将服务迁移到 HTTPS,我们禁止了任何不被服务器直接控制的代理或缓存节点。
然而,我会给你三个理由为什么我认为状态码仍然很重要:
客户端已经处理(或者可以方便地被扩展以便处理)具有特定行为的不同状态码:
- 相比于
302 Found,301 Moved Permanently在 Google 等搜索引擎上有更好的 SEO 效果。 301 Moved Permanently能够被缓存,而429 Too Many Requests不被缓存等等。 有的客户端库可以处理429 Too Many Request,将请求回退并一天之后再次尝试请求。 有的客户端可以用同样的方式处理503 Service Unavilable。
- 相比于
即使对现代需求不能完全满足,许多状态码依然代表着值得处理的特定响应(因此为什么不直接使用标准状态码?)。
- 那些本该返回
405 Method Not Allowed却返回404的 API 让我疯狂地想,“究竟我是敲错了 URL 还是用错误的 HTTP method 请求了服务?” - 我能告诉你如果我们返回
502 Bad Gateway(上游服务问题)而不是返回让人困惑的500 Internal Server Error,那么我们曾经能节省许多调试问题的时间。
- 那些本该返回
不管你信不信,反正我是信了,在广泛被使用的 API 中正在建立一个约定,以返回状态码例如
201 Created,429 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文件之中。
选择一个 HTTP 状态码不再是一件难事 – Racksburg《转载》的更多相关文章
- 选择一个 HTTP 状态码不再是一件难事 – Racksburg
原文链接:http://racksburg.com/choosing-an-http-status-code/ 打开双语对照阅读 有什么能比 HTTP 响应状态码更简单呢?页面渲染了吗?好极了,返回 ...
- 每天一个 HTTP 状态码 前言
前前言 在重新开始写博文(其实大多也就最多算是日常笔记小结)之际,就想着从短小精悍的文章入手,就想到了 HTTP 状态码.另外,记得很久之前,看过一个<每天一个 Linux 命令>系列文章 ...
- 每天一个 HTTP 状态码 203
203 Non-Authoritative Information 203 Non-Authoritative Information 'Non-Authoritative Informative' ...
- 每天一个 HTTP 状态码 201
201 Created 201 Created 表示客户端的请求已经成功完成,结果是创建了一个新资源,通常用于响应「增删改查」里的「增」.如果是严格按照 RESEful style 的 API,那么当 ...
- 每天一个 HTTP 状态码 200
200 OK 话不多说,这个状态码应该是最最最常用的了,无人不知,无人不晓: 就是表示请求成功的意思,你若安好,便是晴天. 摘自对于 https://www.google.com/ GET 请求的响应 ...
- 每天一个 HTTP 状态码 102
102 Processing 102 Processing 是用于 WebDAV协议 请求的状态码. 这个状态码表示服务器已经收到了客户端的请求,正在处理,但暂时还没有可接触的响应.可以用于防止客户端 ...
- 每天一个 HTTP 状态码 205
205 Reset Content 205 Reset Content 表示服务器成功地处理了客户端的请求,要求客户端重置它发送请求时的文档视图.这个响应码跟 204 No Content 类似,也不 ...
- 每天一个 HTTP 状态码 202
202 Accepted 202 Accepted 表示服务器已经接受了这个请求,但是还不确定这个请求是否能够成功地被处理完.该请求最终可能会或可能不会被执行,并且在处理发生时可能会被拒绝,这是不确定 ...
- 每天一个 HTTP 状态码 103
103 Early Hints 103 Earyly Hints 是被用于在最终 HTTP 消息前返回一些响应头,常和 HTTP Header: Link 一起使用,让客户端在服务器还在准备(当前的这 ...
随机推荐
- 从SVD到推荐系统
最近在学习推荐系统(Recommender System),跟大部分人一样,我也是从<推荐系统实践>学起,同时也想跟学机器学习模型时一样使用几个开源的python库玩玩.于是找到了surp ...
- Hadoop基础-网络拓扑机架感知及其实现
Hadoop基础-网络拓扑机架感知及其实现 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网络拓扑结构 在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,其 ...
- 常用的css文件
reset.css(几乎每个项目都要引入的css) @charset "utf-8";html{background-color:#fff;color:#000;font-size ...
- Linux记录-筛选日志sed、find、tail,du,awk命令
1.查看某一段时间的日志 #cat hdfs-audit.log | sed -n '/2018-04-11 10:00:00/,/2018-04-11 10:01:00/ p' | more - ...
- UVALive - 7139(差分+模拟)
题目链接 参考 题意 N*M的网格,一辆车沿着网格线按给定路线走,每个网格里有一个人,人的视线始终看着车,问这些人净转圈数的平方和. 分析 由于车的起点和终点都为左上角,且每个格子里的人永远面对着车, ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- 从池子里的beta看秋香, 个性迥异
从池子里的beta看秋香, 个性迥异 前文里那十只个股为例, 统计了它们的beta值. 回顾如下: Num name code Beta 0 深圳燃气 601139 0.710 公用事业 1 分众传媒 ...
- FastReport报表打印总页数的问题?
设置两次报表后加入引号内内容 "第[Page#]页 共[TotalPages#]页" 本站文章除注明转载外,均为本站原创或翻译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果 ...
- luogu P1600 天天爱跑步
传送门 1A此题暴祭 (下面记点\(x\)深度为\(de_x\),某个时间点记为\(w_x\)) 首先,每条路径是可以拆成往上和往下两条路径的 对于往上的路径,假设有个人往上跑,\(w_y\)在点\( ...
- sqlite limit offset
limit 0,20 表示从第1条开始取20条数据 limit 20 offset 2 表示从第2条开始取出20条数据