小编典典

使用 POST 创建请求,响应代码为 200 或 201 和内容

all

假设我编写了一个 REST 服务,其目的是向系统添加一个新数据项。

我打算发布到

http://myhost/serviceX/someResources

假设可行,我应该使用什么响应代码?我可以返回什么内容。

我正在查看 HTTP
响应代码的定义并查看以下可能性:

200:返回 描述或包含动作结果的实体;

201:表示已创建。含义 请求已完成并导致创建新资源。新创建的资源可以被响应实体中返回的 URI 引用,资源的最具体的 URI 由 Location
头字段给出。响应应该包括一个实体,其中包含资源特征和位置列表,用户或用户代理可以从中选择最合适的一个。实体格式由 Content-Type
标头字段中给出的媒体类型指定。

后者听起来更符合 Http 规范,但我完全不清楚是什么

响应应该包括一个包含资源特征和位置列表的实体

方法。

建议?解释?


阅读 60

收藏
2022-08-21

共1个答案

小编典典

这个想法是响应正文为您提供了一个将您链接到该事物的页面:

201 已创建

( 201Created)
状态码表示请求已完成,并导致创建一个或多个新资源。请求创建的主要资源由Location响应中的标头字段标识,如果未Location收到任何字段,则由有效请求
URI 标识。

这意味着您将 Location 在响应 标头 中包含一个,该标头提供您可以找到新创建 的东西 的 URL :

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597

响应正文

然后他们继续提到您应该在响应 正文 中包含的内容:

201响应负载通常描述并链接到创建的资源。

对于使用浏览器的人,您可以为他们提供可以查看的内容,然后单击以访问他们新创建的资源:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: text/html

Your answer has been saved! 
Click <A href="/a/36373586/12597">here</A> to view it.

如果该页面仅由机器人使用,则将响应设置为计算机可读是有意义的:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/xml

<createdResources>
   <questionID>1860645</questionID>
   <answerID>36373586</answerID>
   <primary>/a/36373586/12597</primary>
   <additional>
      <resource>http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586</resource>
      <resource>http://stackoverflow.com/a/1962757/12597</resource>
   </additional>
</createdResource>

或者,如果您愿意:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/json

{ 
   "questionID": 1860645, 
   "answerID": 36373586,
   "primary": "/a/36373586/12597",
   "additional": [
      "http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586",
      "http://stackoverflow.com/a/36373586/12597"
   ]
}

回应完全取决于您;随心所欲,随心所欲。

缓存友好

最后是我可以预先缓存创建的资源的优化(因为我已经有了内容;我刚刚上传了它)。服务器可以返回一个日期,或者 ETag
我可以将其与我刚刚上传的内容一起存储:

请参阅第 7.2 节,了解响应中验证器标头字段的含义和用途,例如ETagand 。Last- Modified``201

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/23704283/12597
Content-Type: text/html
ETag: JF2CA53BOMQGU5LTOQQGC3RAMV4GC3LQNRSS4
Last-Modified: Sat, 02 Apr 2016 12:22:39 GMT

Your answer has been saved! 
Click <A href="/a/36373586/12597">here</A> to view it.

ETag s 是纯粹的任意值。当资源发生变化(并且缓存需要更新)时,让它们有所不同是最重要的。通常 ETag 是散列(例如
SHA2-256)。但它可以是一个数据库rowversion,也可以是一个递增的修订号。 当事情发生 变化 时,任何事情都会发生变化。 __

2022-08-21