想象一下,一个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错误的请求。 思考?