我有一个RESTful API。它有3个版本:v1,v2和v3。我即将发布v4,我们已决定中止v1,这意味着to的所有请求http://example.com/v1/resource
都会失败,但是to的调用http://example.com/v2/resource
将继续有效。
指示失败的适当方法是什么?我考虑过使用410 GONE
状态码,但这表明该资源不再可用。但是,该资源可能仍然可用,只是必须以其他方式请求它。
我还考虑了通用400
状态代码,但这似乎也很奇怪。有标准答案吗?
我有一个RESTful API。它有3个版本:v1,v2和v3。我即将发布v4,我们已决定中止v1,这意味着to的所有请求http://example.com/v1/resource
都会失败,但是to的调用http://example.com/v2/resource
将继续有效。
指示失败的适当方法是什么?我考虑过使用410 GONE
状态码,但这表明该资源不再可用。但是,该资源可能仍然可用,只是必须以其他方式请求它。
我还考虑了通用400
状态代码,但这似乎也很奇怪。有标准答案吗?
Answers:
似乎没有标准。
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状态代码302最初太宽泛,因此被错误地实现/使用,因此使用303和307来区分302的双重用例。一些API将303用于其他目的。
301永久移动-301(永久移动)状态码表示已为目标资源分配了新的永久URI,以后对该资源的任何引用都应使用其中的一个URI。
302 FOUND -302(已找到)状态代码指示目标资源临时位于其他URI下。由于重定向有时可能会更改,因此客户端应继续将有效请求URI用于将来的请求。
303其他 -对GET请求的303响应指示原始服务器不具有该服务器可以通过HTTP传输的目标资源的表示。但是,“位置”字段值引用的是描述目标资源的资源,因此,对该其他资源进行检索请求可能会导致表示对接收者有用的表示,而不意味着它表示原始目标资源。
410 GONE -410(Gone)状态代码指示在源服务器上不再可以访问目标资源,并且这种情况很可能是永久的。如果原始服务器不知道该条件是否永久存在,或者无法确定该条件是否永久存在,则应改用状态代码404(未找到)。
也许您可以从Google的Youtube API中获取一个页面:
当API请求失败时,YouTube将返回HTTP 4xx或5xx响应代码(通常可识别失败)以及XML响应,其中提供了有关导致失败的错误的更具体信息。对于每个错误,XML响应都包括一个域元素,代码元素以及可能的位置元素。
进一步阅读:
是否仍需要支持传统而无需重定向?即使您仍在支持它并深入实现它,但501似乎也很适合您的情况。那些知道的人仍然可以使用它,而随机变量将看到501 for v1。
10.5.2 501未实现
服务器不支持满足请求所需的功能。当服务器无法识别请求方法并且不支持任何资源时,这是适当的响应。