我正在构建一个允许客户端存储对象的服务器。 这些对象在客户端完全构造,完整的对象ID对于对象的整个生命周期是永久的。
我已经定义了API,以便客户端可以使用PUT创建或修改对象:
PUT /objects/{id} HTTP/1.1
...
{json representation of the object}
{id}是对象ID,因此它是Request-URI的一部分。
现在,我也在考虑允许客户端使用POST创建对象:
POST /objects/ HTTP/1.1
...
{json representation of the object, including ID}
由于POST意味着“追加”操作,我不知道如果对象已经存在该怎么办。 我应该将请求视为修改请求还是应该返回一些错误代码(哪个)?
#1楼
“302 Found”听起来合情合理。 并且RFC 2616说它可以回答除GET和HEAD之外的其他请求(这肯定包括POST)
但是它仍然让访问者通过这个URL来获取RFC的“Found”资源。 为了使它直接进入真正的“找到”URL,应该使用“303 See Other”,这是有道理的,但强制另一个调用GET以下的URL。 好的方面,这个GET是可缓存的。
我想我会用“303见其他” 。 我不知道我是否可以回复身体中发现的“东西”,但我想这样做是为了将一次往返保存到服务器上。
更新:重新阅读RFC之后,我仍然认为不存在的 “4XX + 303 Found”代码应该是正确的。 但是, “409 Conflict”是现有的最佳答案代码 (由@ Wrikken指出),可能包括指向现有资源的Location头。
#2楼
我认为你不应该这样做。
如您所知,POST是修改集合的,它用于创建新项目。 所以,如果你发送id(我认为这不是一个好主意),你应该修改集合,即修改项目,但这是令人困惑的。
用它来添加一个没有id的项目。 这是最好的做法。
如果要捕获UNIQUE约束(而不是id),则可以响应409,就像在PUT请求中一样。 但不是身份证。
#3楼