如何选择正确的HTTP状态码

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/how-to-choose-http-status-code

众所周知,每一个HTTP响应都会带有一个状态码,不过对于很多开发者来说,平时使用最多的几个状态码无外乎就是200、400、404、500等。那其他众多状态码该应用在何种场景中,什么时候应该使用哪些状态码就成为一个值得我们深入思考的问题了。即便在Facebook这样的公司中,那些聪明的开发者所构建的API也可能只返回200。为此,Michael Kropat专门撰文分析了各个状态码的适用场景,以及我们为何要如此细致地区分不同状态码,同时还谈及了这么做的好处。

有什么是比返回一个HTTP状态码还要简单的事情呢?页面渲染了么?如果渲染,那就返回200呗。页面不存在?那就是404。需要将用户重定向到另外一个页面?那就使用302,也许301也行。

一切都是如此简单,不过当有人跟你说,你并没有以REST的方式做事情,你可能就要警醒了。新资源是否返回了RFC兼容、Roy-Fielding建议的状态码?只会是200么?也许是204 No Content、202 Accepted,抑或是201 Created?

问题在于官方HTTP/1.1指南(RFC)最初是在1997年发布的。那时的我们还在使用Netscape Navigator、33.6kbps的调试解调器网上冲浪呢。这就好比是在现代商业战略中使用孙子兵法一样。这些宝贵的建议并不会随着时间的流逝而发生变化。不过,我们需要真正理解他们。

如果有可视化的决策树就好了,它可以帮助你快速识别与你的情况相吻合的状态码,这样就能忽略掉那些不相关的了。请看下图。

上图看起来是显而易见的,不过我发现很多人都会陷入其中,并且提出诸如“这种情况应该使用503 Service Unavailable还是404 Not Found呢”?停。如果你在完全不同的响应类别中思考具体的状态码,那就表明你的做法是完全错误的。再来看看上面这张图。

在继续之前我提出几点:

  • 你不必非得听我的,请直接查看RFC 7231httpstatuses.com
  • 我所面向的读者是那些创建网站或是使用REST API的开发者
  • 我将响应码大致划分为3大类

最后再提一点:我其实并没有什么资格就这个主题发表自己的看法,我只不过阅读过一些RFC并开发过一些APIs而已。如果觉得我说的不对,或是没有使用你倾向于使用的状态码,那么请在文末的评论中指出来,大家一起讨论。

2XX/3XX

4XX

5XX

为何说状态码很重要

虽说Facebook中很多聪明的开发者在构建APIs时只返回200,但我想说的是,状态码确实是非常重要的。现有的状态码对于现代网站/API来说有些太宽泛了。如果响应要以应用特定的格式来包含一些细节信息,比如说哪些字段验证失败了,原因是什么,这样可以让客户端以更加有意义的方式来处理响应。既然如此,那为何不多花点时间来研究一下那些“不太常用”的HTTP状态码呢?

在谈及为何说使用具体的状态码是非常重要的时候,人们很爱提到的一个原因就是HTTP是个分层系统,客户端与服务器之间可能存在着代理、缓存或是其他HTTP库,如果响应码有意义,那会让这一切都工作地更好。不过,我觉得这个解释站不住脚,比如说未来大家都使用上了HTTPS,我们也禁用掉了所有代理与缓存结点,你能说这时状态码就没用了么?

这里,我想谈谈我认为状态码依然很重要的3点原因:

1. 客户端可以针对不同的状态码采取不同的行为(或是可以轻松扩展以应对):

  • 301 Moved Permanently与302 Found对于Google与其他搜索引擎来说还有SEO的隐喻
  • 301 Moved Permanently有缓存的含义,而429 Too Many Requests则没有缓存的含义,诸如此类
  • 客户端库可以通过一段时间的延迟后重试请求来处理429 Too Many Requests
  • 客户端库可以采取类似的方式处理503 Service Unavilable

2. 很多状态码所表示的情况可以通过特殊的响应进行处理。

  • 返回404而非405 Method Not Allowed的APIs有时会让我抓狂,“我是输错了URL还是使用了错误的HTTP方法呢”?
  • 正确区分502 Bad Gateway与500 Internal Server Error会让你省下不少的调试时间。

3. 不管信不信,目前很多流行的APIs建立了一些约定,比如说返回201 Created、429 Too Many Requests,或是503 Service Unavilable。如果遵循这些约定,那么用户在使用你的网站/API时就会更轻松,遇到问题时也更容易解决。

如果你在使用HTTP状态码时遇到了问题,还可以参考如下资源:

各位读者,相信你们中的很多人都曾经或是正在设计API,那么在这个过程中对于状态码你做过哪些思考呢?有哪些见解呢?欢迎分享出来与InfoQ的其他读者一同讨论。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
建BOM人员报告系统程序出问题啦,有图有证据。 BOM不准确可问题大?第一反应,可是为何其他产品展BOM不存在这样的问题呢?挑选这个最简单的成品下阶就是采购件且组成用量和底数都是1,累计组成用量都算不出是0。997009!无论怎么更新程序都出错误。 是否差异一个倍数,1/0.99009=1.003 查看录入BOM **标准批量**1.003 恍然大悟:累计组成用量=组成用量/(底数*标准用量)
1、前序 上篇文章中(《 架构设计:系统间通信(15)——服务治理与Dubbo 上篇 》),我们以示例的方式讲解了阿里DUBBO服务治理框架基本使用。从这节开始我们将对DUBBO的主要模块的设计原理进行讲解,从而帮助读者理解DUBBO是如何工作的。(由于这个章节的内容比较多,包括了知识准备、DUBBO框架概述、DUBBO各模块分析,所以我将把内容切割成多篇文章) 2、基础知识准备 为了让读者更好理解下文讲解的内容,在开始讲解DUBBO框架主要模块前,我们先要介绍一些基础知识。这些基础知识将帮助读者更轻松的
#!/bin/bash#start on 20151209#auto_check.sh#liming#aim to do db check automatically#usage:su - oracle -c 'sqlplus -s / as sysdba' EOF /u01/app/oracle/script_test_result/auto_check.log 21set echo onset feedback onspool /home/oracle/script_test_result/auto_

squid2.7安装与配置 - 2015-12-10 04:12:28

CleverCode最近研究了一下squid的安装与配置。现在总结一下。分享给大家。 1 简介      代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。      Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid 发出一个申请,要Squid 代替其进行下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid
在过去的几年里,三大主流技术已经成为构成当今 web service 技术的全球标准。接下来我们来讨论一下这些技术。 XML-RPC XML-RPC 是在计算机之间交换信息的最简单的基于 XML 的协议。 XML-RPC 是一个简单协议,它使用 XML 消息来执行 RPC 请求被编码到 XML 并通过 HTTP POST 进行发送 XML 响应被嵌入到 HTTP 响应体中 XML-RPC 是与平台无关的 XML-RPC 允许不同的应用进行通信 一个 Java 客户端可以对一个 Perl 服务器进行 XML-
使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速;    我们首先完成C语言版本的shmfifo(基于过程调用), 然后在此基础上实现C++版本的ShmFifo, 将1块共享内存与3个信号量(1个mutext信号量, 1个full信号量, 1个empty信号量)封装成一个类ShmFifo, 然后编写各自的测试代码;   shmfifo说明:    将申请到的共享内存作为一块缓冲区, 将该内存的首部(p_shm到p_payload的内容)格式化为如上图所示的形式
有两种方法可以查看 web service 的架构: 第一个是去检查每个 web service 所负责的角色 第二个是检查 web service 的协议栈 web service 的角色 web service 架构中主要有三种角色: 服务提供者 它是 web service 的提供者。服务提供者实现了服务并且使它可以通过互联网进行访问。 服务请求者 它是 web service 的消费者。请求者通过开启一个网络连接并发送一个 XML 请求来使用一个已有的 web service。 服务注册 这是一个在

spring mvc 简介与例程 - 2015-12-08 18:12:37

老生常谈的spring mvc 再来啰嗦一遍。 spring mvc模型简介: spring mvc 模型,dispatchServlet 充当中央控制器,对http请求做转发处理(mapping),由对应的控制器做相应处理,充当 C (control)。各控制器做相应的业务处理,其中数据处理、业务逻辑等构成M (model),处理器完成数据的处理,经返回给dispatchServlet , 由其交与V(view)展示层完成数据展示。 C(control)请求与控制器 C 通过配置文件实现映射。 M(mo
第一期AD课程录制完毕,欢迎大家多提宝贵意见,因此把价格设置了一个我认为比较合理的价位,50块,前五节课是免费的,后面五节课收费。大家看看合适不合适。 课程列表如下: http://edu.csdn.net/course/detail/1636/25257
1.环境   阿里云  操作系统: Aliyun Linux 5.4 64位   2.安装svn   yum -y install subversion 注:到此为止,svn服务器端已经安装完成 3.配置   建立版本库目录   mkdir /alidata/www/svndata svnserve -d -r /alidata/www/svndata 4.建立版本库   创建一个新的Subversion项目   svnadmin create /alidata/www/svndata/myproject