REST PUT 创建或更新

REST PUT create or update

我想通过以下请求一次性创建或更新项目:

PUT /items/{id}

如果项目已经创建,我应该 return 201 Created,当它更新时 204 No Content?还是我应该 return 两种操作的状态相同?

TL;DR

如果区别对客户来说不重要,则在这两种情况下都使用 200 OK

如果区分很重要,则在创建时使用 201 Created,在更新时使用 200 OK

详情

对于 RESTful 设计,没有单一、正确的做事方式,但我经常发现 original HTTP status code specification 提供了很好的指导。

如果您不希望客户端根据响应采取单独的操作,那么 return 200 OK 总是可以的,但是您 可以 提供如果您认为客户需要更多信息,请提供更多信息。请注意,客户可能会 期望 您的 API,因此一旦您开始提供更多详细信息,就不能轻易改变主意。

也就是说,如果要return201 Created,那么根据规范:

The response SHOULD include an entity containing a list of resource characteristics and location(s) from which the user or user agent can choose the one most appropriate.

例如,您可以将位置放在 Location header 中,但您也可以将其放在响应的 body 中(但是您必须记录body).

的结构和 content-type

当涉及到 204 No Content 响应时,they create dead ends for link-following clients, so if you're creating a true level 3 REST API 那么您应该避免这种响应类型,以示对客户的礼貌。

答案在RFC2616第9.6节中有明确说明:

如果创建了新资源,源服务器必须通过 201(已创建)响应通知用户代理。如果修改现有资源,则应发送 200(确定)或 204(无内容)响应代码以指示请求成功完成。