HTTP在其definition of the PUT
method中包含此内容:
如果目标资源没有当前表示并且PUT成功创建一个,则源服务器必须通过发送201(创建)响应来通知用户代理。如果目标资源确实具有当前表示并且该表示根据所包含的表示的状态被成功修改,则源服务器必须发送200(OK)或204(No Content)响应以指示成功完成请求。
标准 - 非常强烈 - 要求如果创建目标资源,服务器必须返回201。 但为什么?是否有充分的理由告知客户PUT是一个创作,而不是修改?
从我作为服务器编写者的角度来看,这是一个繁重的要求:我写的存储服务支持upserting,但实际上并没有给我任何关于upsert是更新还是插入的指示,遗憾的是。我可以事先查询,但底层服务也不会给我关于该查询的原子性以及随后的upsert,和,这会为底层服务增加额外的往返,所有这些只是为了确定要发送的状态代码。
为什么我不应该忽略这里的规范,并且总是返回201 Created
或204 No Content
中的一个,无论它在语义上是否为创建,都有充分的理由吗?