`
vern
  • 浏览: 15121 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何选择正确的HTTP状态码

 
阅读更多

众 所周知,每一个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 7231与httpstatuses.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://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=401821044&idx=1&sn=af24755036261ac99dcde8f949183025&scene=23&srcid=1218N1N9RponeSlN1Z6fBSoh#rd

分享到:
评论

相关推荐

    HTTP状态码及其含义 下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义。

    HTTP状态码及其含义 下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义。 应当谨慎地使用那些只有HTTP 1.1支持的状态代码,因为许多浏览器还只能够支持HTTP 1.0。如果你使用了HTTP 1.1特有的状态...

    HTTP协议详解

    6.1.1状态码与原因短语 (Status Code and Reason Phrase) 7 实体(Entity) 7.1 实体报文域(Entity Header Fields) 7.2 实体主体(Entity Body) 7.2.1类型(Type) 7.2.2实体主体长度(Entity Length) 8 ...

    Http1.1超文本传输协议中文版

    6.1.1状态码与原因短语 41 6.2响应头域 44 7 实体(Entity) 45 7.1 实体报文域(Entity Header Fields) 45 7.2 实体主体(Entity Body) 46 7.2.1类型(Type) 46 7.2.2实体主体长度(Entity Length) 46 8 连接 ...

    1-1课程整体介绍.mp4

    Rest的含义 以资源为中心的URL设计 Restful六大设计原则 使用HTTPS协议 Restful API的表现层 选择合适的HTTP 状态码 Restful与HTTP协议 HTTP Request实例 使用正确的 HTTP Method HTTP Response实例等

    sql server 集群配置

    20 进入系统后查看计算机的状态 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742652R7uD.png" \* MERGEFORMATINET 21查看管理工具会增加DNS和有关AD的工具,以及安全策略 
...

    2021(国开)计算机应用基础(本)形考任务2---.doc

    选择一项或多项: A.http表示使用超文本标记语言 B.www表示是Web服务器 C.cn代表中国地区 D.ouchn.edu.cn是国家开放大学的域名 15.在使用Word进行文字编辑时,下面的叙述中正确的是_ABC___。 选择一项或多项: A....

    乐视随身看64g T50升级固件.zip

    6、 文件路径选择正确后,点击下方的“确定”按钮,如下图所示。 注意:千万不要到第二个文本框中选择文件路径,下面是升级uboot文件的,一旦上传上传错误文件,会导致随身看变砖。 随身看固件T50稳定版本更新! 7、...

    网络安全选择题答案.docx

    网络安全选择题答案 2017年网络安全选择题答案 一、单选题 1.为了防御网络监听,最常用的方法是(B) A、采用物理传输(非网络)B、信息加密C、无线网D、使用专线传输 2.使网络服务器中充斥着大量要求回复的信息,消耗...

    404错误页面

    此处在“消息类型”中一定要选择“文件”或“默认值”,而不要选择“URL”,不然,将导致返回“200”状态码。 3、404指向一个动态页面,比如error.asp,如果不在页面里面进行设置,仅仅是返回提示的HTML 代码,将...

    东师计算机应用基础21春在线作业1答案.docx

    1 自然码输入法编码方案属于 A 音码 B 形码 C 音形码 D 义码 正确答案:C 2 在WORD的编辑状态,当前文档中有一个表格,选定表格中的一行后,单击表格菜单中"拆分表格"命令 后,表格被拆分成上下两个表格,已选择的...

    IEProxy IE代理

    O(∩_∩)O~其实可以在这里选择任意软件跟随IEProxy启动,这要选择了正确的路径,不过不要选择本软件的地址,否则会进入死循环,桌面蹦出几十个IEProxy窗口(*^__^*) 嘻嘻…… 4.4自动判断锐捷获得IP是否正确,由于...

    自动路由器拨号的软件

    路由器型号不正确时,在日志页里的表现是,登录已经成功,而发送指令时发生错误,其它错误不代表型号选择错误。 2. 路由器地址(管理IP) 一般就是192.168.1.1和192.168.0.1,出现其它IP地址的可能性比较小,IP...

    ip更换随时随地更换IP

    如果软件一直提示“IP和上次一样”的话,要么就是你选择的那个型号不正确,要么就是你的ISP(中国电信/中国网通什么的)做了断开时间的限制了,对于ISP的限制,你可以试试这么办:登录路由器管理界面,找到WAN设置...

    路由IP更换器 FuckRouter

    如果软件一直提示“IP和上次一样”的话,要么就是你选择的那个型号不正确,要么就是你的ISP(中国电信/中国网通什么的)做了断开时间的限制了,对于ISP的限制,你可以试试这么办:登录路由器管理界面,找到WAN设置...

    miflash工具教程

    注意:如果驱动显示为adb请手动更新驱动,必须显示带Bootloader的才是正确的,手动更新驱动选择路径为: 32位系统:C:\Program Files\Xiaomi\MiPhone\Google\Driver 64位系统:C:\Program Files (x86)\Xiaomi\...

    实验1-网络嗅探实验-报告.doc

    3.2实验步骤说明和截图 熟悉Sniffer 工具的使用 Sniffer 主界面 从文件菜单中选择适配器,标题栏将显示激活的探测器 选择适配器 文件菜单----选择网络探测器/适配器(N)----显示所有在Windows中配置的适配器 菜单...

    绿色 无需注册 威望迷你锁屏王

    在现实生活中有的人喜欢一离开电脑就把屏幕锁定,但会给人的感觉太小气,好象生怕人家看他什么似的,用了这款软件后,看起来您的屏幕还是正常的工作状态,但谁也动不了了,当然程序还有另外传统锁屏的选择,一个是您可以...

    bugzilla使用说明

    导出cvs格式的表格,通过excel打开时,中文会显示乱码,因为bugzill是utf8的编码,在excel中不支持,就是把csv文件转成ascii码就能正常显示的,具体是将cvs文档用记事本或utraledit打开,另存为,格式中选择"ANSI/...

    kapo:将任何命令包装在状态套接字中

    卡波 将任何命令包装在状态套接字中。 描述 Kapo是瑞士军刀,用于集成... 第二个将通过继续失败(通过可选的等待间隔)重新启动失败的进程来支持失败的进程,并报告有趣的事实,例如最后一个返回码和状态侦听器的开

Global site tag (gtag.js) - Google Analytics