假设我编写了一个REST服务,其目的是向系统中添加一个新的数据项。
我打算把文章发到
http://myhost/serviceX/someResources
假设这是有效的,我应该使用什么响应代码?以及我可能返回的内容。
我正在查看HTTP响应代码的definitions,并看到以下可能性:
200:返回描述或包含动作结果的实体;
201:这意味着创建。这意味着*请求已经完成,并创建了一个新资源。新创建的资源可以由响应实体中返回的URI引用,其中最具体的URI由Location header字段提供。响应应该包括一个实体,该实体包含用户或用户代理可以从中选择最合适的资源特征和位置的列表。实体格式由Content-Type报头字段中给定的媒体类型指定。*
后者听起来更符合Http规范,但我一点也不清楚
响应应包括一个包含资源特征和位置列表的实体
意思是。
推荐?解释?
发布于 2016-04-02 20:58:35
这个想法是响应体给你一个页面,将你链接到事物:
201创建的
201
( created )状态代码指示请求已完成,并导致创建了一个或多个新资源。由请求创建的主资源由响应中的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
,我可以将其与我刚刚上传的内容一起存储:
有关
201
响应中验证器报头字段(如ETag
和Last-Modified
)的含义和用途的讨论,请参阅Section 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 <A href="/a/36373586/12597">here</A> to view it.
和ETag
s是纯粹的任意值。当资源发生变化(以及缓存需要更新)时,让它们变得不同才是最重要的。ETag
通常是一个哈希(例如SHA2-256)。但它可以是数据库rowversion
,也可以是递增的修订号。当事物改变时,任何会改变的东西。
发布于 2009-12-27 13:58:44
我认为atompub REST API是restful服务的一个很好的例子。请参阅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
<?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,以及该条目在响应主体中的表示。
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值,并且可以选择移除或添加其它元素和属性,或者改变元素内容和属性值。
发布于 2017-06-07 01:13:42
简而言之:
创建对象时为
https://stackoverflow.com/questions/1860645
复制相似问题