HTTP新增状态码(2012年5月)

最近发布了 RFC 6585 。在手册中提到新增了4个状态码。 HTTP依然在不断改变,这正是我们所期待的,这些新的状态码在REST或者基于HTTP协议的服务中将非常有用,这篇文章将告诉你它们的作用和如何使用他们。

428 Precondition Required(需要先决条件)

在一个请求完成前,客户端必须提前发送了请求来满足一个条件。 我们拿经常使用的If-None-Match来说明,如果指定了If-None-Match,客户端只只有在ETAG改变的时候才会去接收返回。 另外一个先决条件的例子是If-Match头,如果If-Match头经常用在PUT方式去更新资源并且没有发生改变,这个场景下,对于多客户端的基于HTTP服务将非常有用,客户端将保证不会覆盖每个客户端自己的内容。 要想使用 428 Precondition Required 状态码,服务端必须指明客户端必须发送一些头来执行请i去。这是一个强制客户端的好方式,以防止客户端“丢失更新”的问题。

429 Too Many Requests(请求太多)

这个请求在API中用来做限制将非常有用(我们知道Twttier的API有请求限制) 在以前我们必须使用其他来代替,比如“509 Bandwidth Limit Exceeded(带宽限制)”。Twttier使用了420状态码做为错误码来返回,对它自己来说这个代码非常重要。 如果你要限制客户端请求服务器的次数,429 Too Many Requests 就是做这个事情的。还可以在返回头中使用“Retry-After”返回头来指明什么时候客户端可以重新访问。

431 Request Header Fields Too Large(请求头太大)

很惊喜的可以看到一个足够通用的用来保证自身的一个状态码。 在客户端发送的HTTP请求头太大的情况下,服务器可以返回431 Request Header Fields Too Large来指明问题所在。 我不清楚他们为什么跳过了430这个代码,我尝试去搜索,但是不能找到任何结果。我猜测很有可能是很多人会把“403 Forbidden”写错成“430 Forbidden”,他们想去避免这种混淆的情况。如果你知道原因,请告诉我。

511 Network Authentication Required(需要网络验证)

这个状态码非常有趣。在你写服务器的时候你可能不太需要,但是对于写一个桌面版的HTTP客户端却非常重要。 如果你经常使用笔记本和移动设备,你会注意到有很多公开的wifi服务需要去接收用户授权或者登录进去才能使用。 在你想使用web服务的时候需要重定向到认证页面,在走HTTP通信中都是这么做的,虽然比较讨厌,但他确实是一种方式。 使用这种方式“拦截”客户端会有一些负面影响,在RFC中有提到有两个例子:
  • 在你打开第一个网站之前,网络设备将会拦截第一个请求。大部分设备都会去尝试存储“favion.ico”。当你登录后,你会注意到favicon是您尝试登录的缓存,并且它将在设备中保持很长一段时间。
  • 当客户端通过HTTP请求去超找一个文档,“网络”将会返回一个登录页来取代本来期待的json或者其他文档格式。客户端将会(错误)假设为这是一个“正常”返回。这可能会造成客户端无法收回的错误状态。我注意到在现实生活中CalDAV系统就是这样。
所以需要用到511 Network Authentication Required
当你写一个基于HTTP的桌面或者手机客户端时,最好检查下返回状态码。这种状态码仅仅是表示了网络是不可用的,你可以忽略返回直到返回正常。然后你可以提供用户返回登录页面,像IOS或者OSX10.7那样。
如果翻译有出入,请大家指点,谢谢! 英文原文:http://www.rooftopsolutions.nl/blog/new-http-status-codes

Comments