QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

如何选择正确的 HTTP 状态码

  • 2015-12-10
  • 本文字数:1858 字

    阅读完需:约 6 分钟

众所周知,每一个 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 状态码时遇到了问题,还可以参考如下资源:

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

2015-12-10 06:565042
用户头像

发布了 88 篇内容, 共 263.8 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

黑客是怎么cookie获取?钓鱼?键盘记录?

喀拉峻

网络安全 XSS

星环科技春季新品发布周,4月19日-23日重磅内容等你来解锁!

星环科技

ETL批量作业调度TASKCTL桌面应用端安装步骤

敏捷调度TASKCTL

kettle 批量任务 ETL 自动化运维 调度任务

synchronized有几种用法?

王磊

Java java面试

《数字经济全景白皮书》金融科技篇 重磅发布!

易观分析

金融科技 互联网金融

使用 Serverless Devs 插件快速部署前端应用

阿里巴巴云原生

阿里云服务网格 ASM 正式发布商业化版本

阿里巴巴云原生

云端守望者(下):十八般武艺

天翼云开发者社区

云计算 云存储

资产跟踪管理系统解决方案

低代码小观

资产管理 企业管理系统 #资产追踪 CRM系统 客户关系管理系统

融云 Unity SDK 升级,专注游戏场景,更好社交体验

融云 RongCloud

互联网通信安全之 WebRTC 传输安全机制

融云 RongCloud

IstioCon 2022,网易数帆六年优化经验即将揭秘

网易数帆

微服务 云原生 istio 服务网格 Service Mesh (ASM)

Scrum基础框架,快速配置Scrum自动化场景

阿里云云效

云计算 阿里云 Scrum 敏捷开发 研发敏捷

持续进击,STI上演极致通缩模型

BlockChain先知

云端守望者(上):十二道难关

天翼云开发者社区

云主机 云安全

千万张医疗影像,都去了哪里?

天翼云开发者社区

云主机 云存储

软件测试很简单么?

chenkl

测试

Excel是世界上最危险的软件?

图灵教育

Python 数据分析 Excel

融云猿桌派:听说女生不适合搞 IT,哈?

融云 RongCloud

Ranger对HDFS权限管理探索与实践

移动云大数据

hdfs Ranger

新一代态势感知系统发布——北望

H3C-Navigator

网络安全 网络 态势感知关联分析、SOC 态势感知 安全运营

记一次Kafka写入超时问题详细分析

移动云大数据

kafka

Tapdata 与阿里云 PolarDB 开源数据库社区联合共建开放数据技术生态

tapdata

数据库

网络协议之:Domain name service DNS详解

程序那些事

Java Netty 程序那些事 4月月更

Linux 信号(Signal)

mazhen

Linux JVM signal Linux Kenel

为什么说Aquqnee有望成为GameFi板块天花板

小哈区块

「连接」与CRM的「中国式」关系

ToB行业头条

Tech Talk 活动预告丨使用 Amazon IoT Core 构建安全合规的智能产品

亚马逊云科技 (Amazon Web Services)

Amazon IoT Core

DPDK技术系统学习一(接收,发送,arp,icmp功能测试)

Linux服务器开发

虚拟化 网络协议栈 Linux服务器开发 DPDK C++后台开发

新华三首发400G园区核心交换机,开启园区超宽时代

H3C-Navigator

网络 交换机 智慧园区 网络交换机

为什么你应该了解 Loggie

网易数帆

Go Kubernetes 云原生 日志 Loggie

如何选择正确的HTTP状态码_REST_张龙_InfoQ精选文章