我有一个REST服务,根据正在查看的资源类型,我有一些可用的操作
因此Resource1
支持Operation1
和Operation2
例如:
Resource1/Operation1
Resource1/Operation2
Resource2
仅支持Operation1
例如:
Resource2/Operation1
因此,如果我在Operation2
上收到Resource2
的电话(例如:Resource2/Operation2
),则服务器不会因为Operation2有效而引发错误,但在内部我不会支持它,所以我应该返回404 - Not Found或501 - Not Implemented是否更准确或其他错误代码?
答案 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,取决于客户端如何与之互动。
你可以使用 501 未实施而非 404 未找到4xx用于客户端错误,5xx用于服务器错误
因为url中的资源不存在。
或者您也可以使用
您自己的自定义错误代码和错误消息。
或
422 无法处理的实体 该请求格式正确,但由于语义错误而无法遵循。
答案 3 :(得分:0)
如果根据定义客户端请求是非法的,我将返回 HTTP 400错误请求。
发送HTTP 400还意味着不应仅仅重试请求,因为它是永久性的非法且服务器无法理解。
只有使用HTTP 400才能保留它通常似乎用于格式错误的请求;拼写错误等。无论您的请求是非法还是格式错误,都是一个语义问题。