【问题标题】:REST web service: Error code should be 404 or 405?REST Web 服务:错误代码应该是 404 还是 405?
【发布时间】:2020-12-16 04:13:44
【问题描述】:
我想问一下这种情况我应该返回什么错误代码:
假设我们有一个带有这个路径的网络服务:
/customer-web/customers/{customerId}/subscription/{subscriptionId}
默认情况下,如果用户没有指定subscriptionId,我们会得到一个405 Method not allowed
但是,如果我们省略customerId,我们会得到404 Not found
正确吗?我们应该以某种方式统一错误代码吗?
谢谢!
[编辑]
还有一件事:例如,如果我们假设仅 DELETE 方法...您的答案是否也相同?谢谢!
【问题讨论】:
标签:
java
rest
web-services
http-error
【解决方案1】:
-
404 Not found适用于请求的资源不可用
-
405 Method not allowed在资源不支持HTTP方法时使用(例如对于只读资源,
GET可能允许但@987654322不允许@、PUT 或 DELETE)。
当用户未指定subscriptionId 时,请求的资源将为/customer-web/customers/{customerId}/subscription/。
该资源可能存在(并列出所有订阅),也可能不存在(没有绑定到该资源),在这种情况下,404 Not found 是合适的。
【解决方案2】:
是的,逻辑不正确。
假设您是一位客户,并且您有一些关于您自己的数据/信息。这些保存在数据库或其他数据存储中。现在,您将被视为该服务的用户。现在,该服务提供了一些功能,例如: 他们可以为您提供有关您喜欢的主题的最新消息。现在您必须订阅该特定功能才能收到通知。但是为了让自己得到通知,服务器首先必须为您订阅该事件/功能。 每个数据库/数据存储的表的行都有一个唯一标识符,例如行号。 现在,他们必须搜索该 Id/行号(假设行号作为您的用户 ID)来检查您是否是适用用户与否。
如果他们找到您,他们会将您的身份验证者 ID 或用户 ID 订阅到事件表的 subscribedUser 列,并将该事件订阅 ID 添加到您的行的 subscribedEvents 列。然后,如果您订阅了,那么他们会向您发送有关您最喜欢的主题或其他内容的通知。
在上面的故事中,为用户/客户创建订阅所需的事情是:
- CustomerID/UserID(这可以是该用户/客户的行索引号,将被推送到该事件的
subscribedUser 列)
- EventID(这可以是该事件的行索引号,将用作subscriptionId,将被推送到该用户/客户行的
subscribedEvent 列)
现在,如果上面的 ID 缺少一个,那么您将搜索什么?如果您不提供其中任何一个并且行号或 UserID/EventId 不能为 Null,则可能您将拥有 null|undefined,因为它们是数字并且也是唯一的。很容易猜到,查询操作会返回一个空的[] 甚至null。 null 是一个假值。所以服务器肯定会将此视为错误并将404作为Not Found响应发送回。
但有一件事,如果 customerId 用作 URI 的参数 :parameter 并且如果它没有被传递,那么 URL 将指向另一个端点并且将返回其他/不相关的响应。如果该端点不存在,那么它将返回另一个 404 错误。 subscriptionId 也是如此。以上标准仅适用于错误的customerId或subscriptionId。现在,如果您不通过其中任何一个,那么地址将是错误的,如果该端点中不存在任何内容,则发送404;如果端点存在,则发送其他响应。