当REST中的资源不支持操作时,HTTP状态代码404或501

时间:2016-02-10 09:28:45

标签: rest http

我有一个REST服务,根据正在查看的资源类型,我有一些可用的操作

因此Resource1支持Operation1Operation2

例如:

Resource1/Operation1

Resource1/Operation2

Resource2仅支持Operation1

例如:

Resource2/Operation1

因此,如果我在Operation2上收到Resource2的电话(例如:Resource2/Operation2),则服务器不会因为Operation2有效而引发错误,但在内部我不会支持它,所以我应该返回404 - Not Found或501 - Not Implemented是否更准确或其他错误代码?

4 个答案:

答案 0 :(得分:5)

您必须考虑资源(存在并对其进行操作)而不是Web服务中的服务(您调用它们做某事)。

因此,REST API的每个 Operation 都是一个资源(即模拟长时间运行的操作或通过发送 POST 触发的某种更复杂的事务)对操作资源的请求) - 该资源的URI是任何不透明的字符串,可以是'Resource1 / Operation1'或“/ someOther / arbitrary / path”,

501表示HTTP服务器本身具有未实现的特定功能,需要满足请求 - 即它缺少一些技术功能 - 但资源本身是有效的。

但是正如您所写,您的Rest API根本不支持Resource2的Operation2,这意味着没有“Resource2 / Operation2”服务资源。因此,404响应是唯一合理的选择。

就“客户端如何互动...”而言,问问自己:鉴于是资源的消费者(即一些任意的网站),你会在收到时重新访问相同的网址吗? 404? (可能不是)你会在收到501时做什么? (可能是的,因为你认为问题已在此期间得到解决)

<强> TL; DR

返回404

答案 1 :(得分:1)

永远不要从您的代码返回任何HTTP 5XX状态。服务器使用它来报告服务器内部问题。如果您正在使用它,那么应用程序用户会感到困惑。所以只需使用404即可。

答案 2 :(得分:1)

你可以使用其中任何一个,

它的webapis,取决于客户端如何与之互动。

  

4xx用于客户端错误,5xx用于服务器错误

你可以使用 501 未实施而非 404 未找到

因为url中的资源不存在。

  

或者您也可以使用

您自己的自定义错误代码和错误消息。

422 无法处理的实体 该请求格式正确,但由于语义错误而无法遵循。

答案 3 :(得分:0)

如果根据定义客户端请求是非法的,我将返回 HTTP 400错误请求

发送HTTP 400还意味着不应仅仅重试请求,因为它是永久性的非法且服务器无法理解。

只有使用HTTP 400才能保留它通常似乎用于格式错误的请求;拼写错误等。无论您的请求是非法还是格式错误,都是一个语义问题。