什么是正确的HTTP状态代码:“此API版本已停产”?


13

我有一个RESTful API。它有3个版本:v1,v2和v3。我即将发布v4,我们已决定中止v1,这意味着to的所有请求http://example.com/v1/resource都会失败,但是to的调用http://example.com/v2/resource将继续有效。

指示失败的适当方法是什么?我考虑过使用410 GONE状态码,但这表明该资源不再可用。但是,该资源可能仍然可用,只是必须以其他方式请求它。

我还考虑了通用400状态代码,但这似乎也很奇怪。有标准答案吗?


没有API错误的HTTP状态代码,因为API与HTTP无关。您说的是,该资源仍然可用,但是与REST中的资源不同,必须以不同的方式请求该资源,因此,不,该资源不可用。
罗布

Answers:


11

似乎没有标准。

StackOverflow的答案趋向于410 GONE,但我认为永久移动301更合适。

为了做出正确的选择,我们必须查看您的具体情况。如果您的目标是使对API v1的所有调用失败而无需采取任何进一步措施,则410 GONE可以解决该问题。如果您需要某种连续性,例如将客户端重定向到您的API可能会成功调用的较新版本,则3XX可以使用,但是您选择哪个呢?我认为,如果您尝试关闭API v1,则301 MOVED PERMANENTLY会比303 SEEE OTHER更好,因为301建议将来所有请求都应发送到新网址,而303则不表明这种情况常驻。

我建议对API进行工程设计,以使每个版本都向后兼容,以便每当您为新API版本添加新端点时,“永久移动301”将透明地保持API的生命周期和最新状态。我认为这就是您正在尝试做的事情。

HTTP状态码

HTTP状态代码302最初太宽泛,因此被错误地实现/使用,因此使用303和307来区分302的双重用例。一些API将303用于其他目的。

301永久移动-301(永久移动)状态码表示已为目标资源分配了新的永久URI,以后对该资源的任何引用都应使用其中的一个URI。

302 FOUND -302(已找到)状态代码指示目标资源临时位于其他URI下。由于重定向有时可能会更改,因此客户端应继续将有效请求URI用于将来的请求。

303其他 -对GET请求的303响应指示原始服务器不具有该服务器可以通过HTTP传输的目标资源的表示。但是,“位置”字段值引用的是描述目标资源的资源,因此,对该其他资源进行检索请求可能会导致表示对接收者有用的表示,而不意味着它表示原始目标资源。

410 GONE -410(Gone)状态代码指示在源服务器上不再可以访问目标资源,并且这种情况很可能是永久的。如果原始服务器不知道该条件是否永久存在,或者无法确定该条件是否永久存在,则应改用状态代码404(未找到)。

现有的API如何处理此问题?

也许您可以从Google的Youtube API中获取一个页面:

当API请求失败时,YouTube将返回HTTP 4xx或5xx响应代码(通常可识别失败)以及XML响应,其中提供了有关导致失败的错误的更具体信息。对于每个错误,XML响应都包括一个域元素,代码元素以及可能的位置元素。

进一步阅读:


2
301似乎很危险。这将导致自动重定向到可能没有相同规范意义的地方。
Brandon Yarbrough 2014年

欣赏输入。所有3XX代码均指示客户端必须通过在Location标头中提供备用网址来执行其他操作(重定向)。有趣的是,每个代码的重定向行为略有不同。303会将POST作为GET重定向到新位置。我一定会使用更多信息来更新此答案。
perry

1

重定向对于已移动的资源非常有用。而不是301永久重定向(这将指示没有API更改的重命名),我将使用303“ See Other”重定向。


0

是否仍需要支持传统而无需重定向?即使您仍在支持它并深入实现它,但501似乎也很适合您的情况。那些知道的人仍然可以使用它,而随机变量将看到501 for v1。

10.5.2 501未实现

服务器不支持满足请求所需的功能。当服务器无法识别请求方法并且不支持任何资源时,这是适当的响应。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


0

我将在503中使用一条消息,指出该服务不可用,并指示使用较新的版本。可以为50%的呼叫返回此消息,然后逐渐增加到100%。

对于透明迁移,我将使用308-永久重定向,因为此方法不像301那样修改动词(POST将为POST)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.