假设我编写了一个 REST 服务,其目的是向系统添加一个新数据项。
我打算发布到
http://myhost/serviceX/someResources
假设可行,我应该使用什么响应代码?我可以返回什么内容。
我正在查看 HTTP 响应代码的定义并查看以下可能性:
200:返回 描述或包含动作结果的实体;
201:表示已创建。含义 请求已完成并导致创建新资源。新创建的资源可以被响应实体中返回的 URI 引用,资源的最具体的 URI 由 Location 头字段给出。响应应该包括一个实体,其中包含资源特征和位置列表,用户或用户代理可以从中选择最合适的一个。实体格式由 Content-Type 标头字段中给出的媒体类型指定。
后者听起来更符合 Http 规范,但我完全不清楚是什么
响应应该包括一个包含资源特征和位置列表的实体
方法。
建议?解释?
这个想法是响应正文为您提供了一个将您链接到该事物的页面:
201 已创建 ( 201Created) 状态码表示请求已完成,并导致创建一个或多个新资源。请求创建的主要资源由Location响应中的标头字段标识,如果未Location收到任何字段,则由有效请求 URI 标识。
201 已创建
( 201Created) 状态码表示请求已完成,并导致创建一个或多个新资源。请求创建的主要资源由Location响应中的标头字段标识,如果未Location收到任何字段,则由有效请求 URI 标识。
201
Location
这意味着您将 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 我可以将其与我刚刚上传的内容一起存储:
ETag
请参阅第 7.2 节,了解响应中验证器标头字段的含义和用途,例如ETagand 。Last- Modified``201
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,也可以是一个递增的修订号。 当事情发生 变化 时,任何事情都会发生变化。 __
rowversion