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

指示失败的合适方法是什么?我考虑过使用410 GONE状态代码,但这表明该资源不再可用。但是,该资源可能仍然可用,只是必须以不同的方式请求它。有标准答案吗?

评论

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

#1 楼

似乎没有标准。
StackOverflow的答案趋向410 GONE,但我认为永久地移动301更合适。
要做出正确的选择,我们必须看您的具体情况。如果您的目标是使对API v1的所有调用失败而无需采取任何进一步措施,则410 GONE可以解决该问题。如果您需要某种连续性,例如将客户端重定向到您的API可能会成功调用的较新版本,则3XX可以使用,但是您选择哪个呢?我认为,如果您尝试关闭API v1,则301 MOVED PERMANENTLY会比303 SEE OTHER更好,因为301建议将来所有请求都应发送到新网址,而303则不表明这种情况
,我建议您对API进行工程设计,以使每个版本都向后兼容,这样无论何时为新API版本添加新端点,“永久移动301”都会透明地保持API的生命力和最新状态。我认为您无论如何都想这样做。用例。某些API将303用作其他用途。
301已永久移动-状态代码301(已永久移动)指示目标资源已分配了新的永久URI,以后对该资源的任何引用都应使用其中一个URI。
302找到-302(已找到)状态代码表示目标资源暂时位于其他URI下。由于重定向有时可能会更改,因此客户端应继续将有效的请求URI用于以后的请求。
303其他-对GET请求的303响应指示原始服务器不具有该服务器可以通过HTTP传输的目标资源的表示。但是,“位置”字段值引用的是描述目标资源的资源,因此,对该其他资源进行检索请求可能会导致表示对接收者有用的表示,而不意味着它表示原始目标资源。 /> 410 GONE-状态代码410(Gone)指示在原始服务器上不再可以访问目标资源,并且这种情况很可能是永久的。如果原始服务器不知道或无法确定条件是否永久存在,则应改用状态代码404(未找到)。
现有的API如何处理此问题?
也许您可以从Google的Youtube API中获取一个页面:

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




BigCommerce API使用302 FOUND。

《 Atlassian REST API指南》提示永久性地移动了301,以及详细描述该错误的子代码。这类似于Youtube API的方法。

进一步阅读:

REST API的版本如何?
Netflix API设计:何时应对趋势>

评论


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

–布兰登·雅伯(Brandon Yarbrough)
2014年10月21日在21:21

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

– perry
14-10-21在23:27

#2 楼

重定向对于已移动的资源非常有用。代替301永久重定向(这将指示重命名而无需更改API),我将使用303“查看其他”重定向。

#3 楼

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


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



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

#4 楼

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

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