2013-07-26 57 views
17

我有一个移动设备通过HTTPS与我的服务器上的RESTful API进行通信。其中一项操作是数据同步,用于将在离线状态下进行的修改推送到服务器,并在服务器上并行执行更新。HTTP状态码是否需要升级仅需要升级到安全通道的信号?

我遇到了一个边缘情况,那个同步操作可能会在现有客户端中静默失败。我已升级客户端上的“同步协议”以正确处理条件。理想情况下,我想让所有较旧的客户端在尝试同步时收到一条消息,告诉他们升级。

通信只是在我的服务器和我的移动客户端之间,所以我意识到我可以返回任意数量的HTTP代码,并通知客户端将来会显示一条消息,建议用户升级并立即停止同步过程。

它会被视为HTTP 426 Upgrade Required返回码的意图的混蛋,用它来表示这一点。每个参考(IETF RFC 2817,Wikipedia)我可以找到说话使用它来发信号通知客户端升级到TLS。是否仅限于定义良好的/安全协议(如SSL和TLS),还是仅在传统上仅用于SSL和TLS的HTTP层的通用升级标志?

如果不是为了这个用例,HTTP 303 See Other会被认为更合适还是有另一个我错过的代码?

+0

[RFC 2616](http://tools.ietf.org/html/rfc2616#section-14.42)说你必须告诉客户端“升级”到什么地方。如果你能适合你的用例,那可能不是混蛋。 ;) – Sven

回答

11

引用我previous answers之一:

HTTP Upgrade用于指示的偏好或要求 切换到不同版本的HTTP或到另一个协议,如果 可能:

The Upgrade general-header allows the client to specify what 
additional communication protocols it supports and would like to use 
if the server finds it appropriate to switch protocols. The server 
MUST use the Upgrade header field within a 101 (Switching Protocols) 
response to indicate which protocol(s) are being switched. 

     Upgrade  = "Upgrade" ":" 1#product 

    For example, 

    Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 

The Upgrade header field is intended to provide a simple mechanism 
for transition from HTTP/1.1 to some other, incompatible protocol. 

根据IANA register,它只有3个注册的 (包括HTTP规范本身中的一个)。

另外两个是:

(IANA的寄存器从那时起没有改变。)

RFC 2817限定的426响应代码显然有与RFC定义中的“HTTP升级”感升级到做这是在当前使用的层(即,HTTP本身)处改变当前协议。(甚至根本没有从http://https://的升级。)

在HTTP之上交换的消息(如果是协议的一部分)不是这个的一部分。就HTTP而言,它们只是超媒体实体。

如果您改变超媒体的含义,我认为426并不适合。平原400可能是更好的选择。请注意,带有错误状态代码(4xx,5xx)的响应不会阻止您在响应中关联实体:这是一条告诉客户端升级您的协议(在该级别)的消息的位置。

4

我同意布鲁诺说426不是最好的选择。 400更好,但我认为403还是更好。

10.4.4 403禁止

服务器理解了请求,但拒绝执行。授权不起作用,请求不应重复。如果请求方法不是HEAD并且服务器希望公开为什么请求没有被满足,那么它应该描述在实体中拒绝的原因。如果服务器不希望将该信息提供给客户端,则可以使用状态码404(未找到)代替。

Twitter API上有这个先例。

自2014年2月26日起,api.twitter.com将为所有非SSL传入流量返回403状态码。你的客户端代码应该能够处理这个错误。