是HTTP 404的PUT操作的适当响应,其中未找到一些链接的资源? [关闭](Is HTTP

2019-06-24 17:17发布

想象一下,一个REST Web服务在其中添加项目到某些类型的容器。 例如,让我们说,我们可以添加一个与会者#789到事件#456是这样的:

PUT http://..../api/v1/events/456/attendees/789

如果任一事件#456或参加者789是不存在的,是正确与详细的错误有效载荷说明了什么问题返回一个HTTP 404(沿,如{ "error" : { "message" : "Event 456 does not exist" , "code" : "404" } }

同样,如果我创造新事物是指到另一个对象,但其他对象不存在? 例如,假设我创建的位置#123事件

PUT http://..../api/v1/event
{ "location": 123, "name": "Party", "date": "2012-05-23", ...etc... }

如果位置#123不存在,是它也是正确的返回404(连同响应详细)? 如果没有,什么是适当的 - 只是一个400?

根据HTTP 1.1规范http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.6 PUT ......如果资源无法创建或请求URI修改,相应的错误反应,应给予反映问题的本质

因此,这似乎是一个很好的投用404响应但是由于某种原因,我不能完全把我的手指上,响应PUT(或POST)有404似乎有些奇怪,我...也许是因为404名的意思该资源不能被发现,但在这种情况下,我们的资源实际上是两个其他资源之间的联系,这是一个不能被发现,这两项资源之一。

不要太担心这里我详细的例子 - 它们是由说明这一点。 主要的问题是:是404,因为链接的资源没有找到发生故障的PUT操作的适当反应?

这将是优秀的,如果你可以指向引用 - 我有一个很难找到任何进入这个级别的细节,也是足够可信的。 特别是关于治疗REST API设计资源的关系。

更新的思维 ,我想,可能是第一个例子应该返回404,第二不应该。 其理由是,在第一种情况下的资源,我们正在增加使用事件456和参与者789,因为它是复合主键; 第二种情况下位置是唯一的一个外键。 在第二种情况下,应返回一个错误,而不是404 - 可能是412前置条件失败或者只是一个400错误的请求。 思考?

Answer 1:

有许多的4xx HTTP状态码 。 最有可能是404或409:

404未找到

服务器没有找到任何匹配的有效请求的URI。 没有任何迹象表明,给出的条件是否是暂时的还是永久的。 如果服务器知道应该使用410(已删除)状态代码,通过一些内部配置机制,旧资源永久不可用,也没有转发地址。 这个状态码是常用的,当服务器不希望透露究竟为什么请求被拒绝,或在没有其他反应是适用的。

409冲突

请求无法完成,因为与资源的当前状态的冲突。 其中,预计用户可能能够解决冲突并重新提交申请,那么这个代码仅在允许的情况下。 响应机构应包含足够的信息,用户识别冲突的根源。 理想情况下,响应表示将包括为用户或用户代理来解决这个问题的足够信息; 然而,这也许是不可能的,而不是必需的。

冲突最有可能响应PUT请求发生。 例如,如果版本正在使用和正在放表示包括改革资源与那些由早期(第三方)提出请求冲突时,服务器可能会使用409响应,表明它无法完成请求。 在这种情况下,响应表示可能会包含两个版本之间的差异列表。

无论是那些将是合适的,但我认为409 404用于URI没有找到 ,但409表示资源的当前状态不允许的操作要求我会去。 在你的情况,因为有什么不妥,不允许其要求不能满足。



文章来源: Is HTTP 404 an appropriate response for a PUT operation where some linked resource is not found? [closed]
标签: api http rest