当前位置:  开发笔记 > 前端 > 正文

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

如何解决《使用POST创建请求,响应代码为200或201以及内容》经验,为你挑选了5个好方法。

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

我计划发帖到

http://myhost/serviceX/someResources

假设有效,我应该使用什么样的响应代码?我可以回复什么内容.

我正在查看HTTP响应代码的定义并看到这些可能性:

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

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

后者听起来更符合Http规范,但我一点也不清楚

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

手段.

建议?解释?



1> Chandra Patn..:

我认为atompub REST API是一个很好的宁静服务示例.请参阅atompub规范中的以下代码段:

POST /edit/ HTTP/1.1
Host: example.org
User-Agent: Thingio/1.0
Authorization: Basic ZGFmZnk6c2VjZXJldA==
Content-Type: application/atom+xml;type=entry
Content-Length: nnn
Slug: First Post



  Atom-Powered Robots Run Amok
  urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
  2003-12-13T18:30:02Z
  John Doe
  Some text.

服务器用状态代码201表示成功创建.响应包括指示Atom Entry的成员条目URI的Location头,以及响应正文中该Entry的表示.

HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: nnn
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/edit/first-post.atom
ETag: "c180de84f991g8"  



  Atom-Powered Robots Run Amok
  urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
  2003-12-13T18:30:02Z
  John Doe
  Some text.
  

Collection创建和返回的Entry可能与客户端POST的Entry不匹配.服务器可以更改Entry中各种元素的值,例如atom:id,atom:updated和atom:author values,并且可以选择删除或添加其他元素和属性,或者更改元素内容和属性值.


Atom可能已经死了,但这个例子的精神仍然存在.
同意!这是必要性的优化 - 但你不想过早地做到这一点.在Restful spirits中进行设计并在必要时进行例外处理非常重要.
如果资源处于千兆字节范围内,则返回创建的资源可能会有点多...
@ChandraPatni,**Atom死了**.需要更好的例子.
我对201响应的原始解释更像是"嘿,你想创建一个资源,但是根据上下文,你要么对最终结果不感兴趣,要么具有写访问权限但不能读取这个资源."在返回主集合之前,您需要的只是创建资源的URL.作为证据创建它." 除此之外的任何事情本质上都是200响应.除非RFC考虑到其他因素.

2> Ian Boyd..:

我们的想法是,响应主体会为您提供一个链接到该事物的页面:

201创建

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

这意味着您将Location在响应标头中包含一个a ,该标头提供了您可以在哪里找到新创建的东西的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 here 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


   1860645
   36373586
   /a/36373586/12597
   
      http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586
      http://stackoverflow.com/a/1962757/12597
   

或者,如果您愿意:

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,我可以存储我刚刚上传的内容:

有关201响应中验证器标头字段(如ETag和Last-Modified)的含义和用途的讨论,请参见第7.2节.

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 here to view it.

ETags为纯粹的任意值.当资源发生变化(并且需要更新缓存)时,让它们变得不同是最重要的.ETag通常是哈希(例如SHA2).但它可以是数据库rowversion,也可以是递增的修订号.当事物发生变化时会发生任何变化.



3> Stéphane Bru..:

简而言之:

200创建返回对象时

201创建对象但仅​​返回其引用(例如ID或链接)


在阅读https://tools.ietf.org/html/rfc7231#section-6.3.1之后,我同意这种理解 - 我想我更多地问你是如何达到它的.但现在在我的理解中... 200 =资源创建并返回| 201 =创建资源并返回引用 204 =已创建资源且未返回有效负载
我从https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html和https://httpstatuses.com/201了解到的信息

4> ma11hew28..:

查看HTTP:方法定义:POST.

POST方法执行的操作可能不会生成可由URI标识的资源.在这种情况下,200(OK)或204(No Content)是适当的响应状态,具体取决于响应是否包括描述结果的实体.

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节).



5> tempire..:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

它只是一个以冒号分隔的键值.

ETag:"xyzzy"

它可以是任何类型的文本数据 - 我通常包含一个JSON字符串,其中包含所创建项目的标识符.单独测试的简易性使得包括它值得.

ETag: "{ id: 1234, uri: 'http://domain.com/comments/1234', type: 'comment' }"

在此示例中,所创建项的标识符,uri和类型是"资源特征和位置".


指定问题,以便人们可以学习.否则,评论只是挥手.
您是说ETag对应于包含资源特征和位置*列表的*实体.我可以看到你的建议很好,非常同意你关于测试的观点.但是,我不知道这是如何符合"资源特征和位置列表"的.
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有