首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Create request with POST,响应代码200或201和内容

Create request with POST,响应代码200或201和内容
EN

Stack Overflow用户
提问于 2009-12-07 23:20:06
回答 7查看 192.2K关注 0票数 163

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

我打算把文章发到

代码语言:javascript
运行
复制
http://myhost/serviceX/someResources

假设这是有效的,我应该使用什么响应代码?以及我可能返回的内容。

我正在查看HTTP响应代码的definitions,并看到以下可能性:

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

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

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

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

意思是。

推荐?解释?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-04-02 20:58:35

这个想法是响应体给你一个页面,将你链接到事物:

201创建的

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

这意味着您将在响应头中包含一个Location,它提供了您可以在何处找到新创建的内容的URL

代码语言:javascript
运行
复制
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597

响应体

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

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

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

代码语言:javascript
运行
复制
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.

如果页面仅供机器人使用,那么让响应成为计算机可读的响应是有意义的:

代码语言:javascript
运行
复制
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>

或者,如果您喜欢:

代码语言:javascript
运行
复制
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响应中验证器报头字段(如ETagLast-Modified )的含义和用途的讨论,请参阅Section 7.2

代码语言:javascript
运行
复制
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,也可以是递增的修订号。当事物改变时,任何会改变的东西。

票数 112
EN

Stack Overflow用户

发布于 2009-12-27 13:58:44

我认为atompub REST API是restful服务的一个很好的例子。请参阅atompub规范中的以下代码片段:

代码语言:javascript
运行
复制
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

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
</entry>

服务器用状态码201表示创建成功。该响应包括一个Location头部,该头部指示Atom条目的成员条目URI,以及该条目在响应主体中的表示。

代码语言:javascript
运行
复制
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"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"
      href="http://example.org/edit/first-post.atom"/>
</entry>

集合创建并返回的项可能与客户端的项POSTed不匹配。服务器可以改变条目中的各种元素的值,诸如atom:id、atom:updated和atom:author值,并且可以选择移除或添加其它元素和属性,或者改变元素内容和属性值。

票数 94
EN

Stack Overflow用户

发布于 2017-06-07 01:13:42

简而言之:

创建对象时为

  • 200,创建对象但只返回其引用(如ID或链接)时为returned
  • 201
票数 83
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1860645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档