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(无内容)响应代码以指示请求成功完成。
我想通过以下请求一次性创建或更新项目:
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).
当涉及到 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(无内容)响应代码以指示请求成功完成。