[英]Create request with POST, which response codes 200 or 201 and content

Suppose I write a REST service whose intent is to add a new data item to a system.


I plan to POST to



Suppose that works, what response code should I use? And what content might I return.


I'm looking at the definitions of HTTP response codes and see these possibilities:


200: Return an entity describing or containing the result of the action;


201: which means CREATED. Meaning *The request has been fulfilled and resulted in a new resource being created. The newly created resource can be referenced by the URI(s) returned in the entity of the response, with the most specific URI for the resource given by a Location header field. The response SHOULD include an entity containing a list of resource characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content-Type header field. *

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

The latter sounds more in line with the Http spec, but I'm not at all clear what


The response SHOULD include an entity containing a list of resource characteristics and location(s)




Recommendations? Interpretations?


7 个解决方案





It's just a colon delimited key-value.


ETag: "xyzzy"


It can be any type of text data - I generally include a JSON string with the identifier of the item created. The ease of testing alone makes including it worthwhile.

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

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

In this example, the identifier, the uri, and type of the created item are the "resource characteristics and location".




I think atompub REST API is a great example of a restful service. See the snippet below from the atompub spec:

我认为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

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <author><name>John Doe</name></author>
  <content>Some text.</content>

The server signals a successful creation with a status code of 201. The response includes a Location header indicating the Member Entry URI of the Atom Entry, and a representation of that Entry in the body of the response.

服务器用状态代码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"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"

The Entry created and returned by the Collection might not match the Entry POSTed by the client. A server MAY change the values of various elements in the Entry, such as the atom:id, atom:updated, and atom:author values, and MAY choose to remove or add other elements and attributes, or change element content and attribute values.

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



The idea is that the response body gives you a page that links you to the thing:


201 Created


The 201 (Created) status code indicates that the request has been fulfilled and has resulted in one or more new resources being created. The primary resource created by the request is identified by either a Location header field in the response or, if no Location field is received, by the effective request URI.


This means that you would include a Location in the response header that gives the URL of where you can find the newly created thing:


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

Response body

They then go on to mention what you should include in the response body:


The 201 response payload typically describes and links to the resource(s) created.


For the human using the browser, you give them something they can look at, and click, to get to their newly created resource:


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.

If the page will only be used by a robot, the it makes sense to have the response be computer readable:


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


Or, if you prefer:


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": [

The response is entirely up to you; it's arbitrarily what you'd like.


Cache friendly

Finally there's the optimization that i can pre-cache the created resource (because i already have the content; i just uploaded it). The server can return a date or ETag which i can store with the content i just uploaded:


See Section 7.2 for a discussion of the meaning and purpose of validator header fields, such as ETag and Last-Modified, in a 201 response.


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
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.

And ETag s are purely arbitrary values. Having them be different when a resource changes (and caches need to be updated) is all that matters. The ETag is usually a hash (e.g. SHA2). But it can be a database rowversion, or an incrementing revision number. Anything that will change when the thing changes.

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



Check out HTTP: Method Definitions: POST.


The action performed by the POST method might not result in a resource that can be identified by a URI. In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on whether or not the response includes an entity that describes the result.

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

If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header (see section 14.30).




In a few words:


  • 200 when an object is created and returned
  • 200创建并返回对象时
  • 201 when an object is created but only its reference is returned (such as an ID or a link)
  • 201创建对象但仅​​返回其引用(例如ID或链接)时



The output is actually dependent on the content type being requested. However, at minimum you should put the resource that was created in Location. Just like the Post-Redirect-Get pattern.


In my case I leave it blank until requested otherwise. Since that is the behavior of JAX-RS when using Response.created().


However, just note that browsers and frameworks like Angular do not follow 201's automatically. I have noted the behaviour in http://www.trajano.net/2013/05/201-created-with-angular-resource/




Another answer I would have for this would be to take a pragmatic approach and keep your REST API contract simple. In my case I had refactored my REST API to make things more testable without resorting to JavaScript or XHR, just simple HTML forms and links.

我将要做的另一个答案是采取务实的方法并保持REST API合约的简单性。在我的情况下,我重构了我的REST API,以便在不使用JavaScript或XHR,只需简单的HTML表单和链接的情况下使事情更具可测性。

So to be more specific on your question above, I'd just use return code 200 and have the returned message contain a JSON message that your application can understand. Depending on your needs it may require the ID of the object that is newly created so the web application can get the data in another call.


One note, in my refactored API contract, POST responses should not contain any cacheable data as POSTs are not really cachable, so limit it to IDs that can be requested and cached using a GET request.





如何在Alamofire中快速打印来自post请求的响应的json内容? - How can I print the json content of the response from post request in Alamofire in swift? 在JSONP请求中设置响应内容类型标头? - Setting response content type header in JSONP request? Android:如何使用自定义http标头和内容类型创建post xml-rpc请求 - Android: how to create post xml-rpc request with custom http header & content type 使用Cacti监控请求响应的HTTP状态代码? - Use Cacti to Monitor HTTP Status Codes of Request Responses? HTML文件作为对POST请求的响应? - HTML file as the response to a POST request? Scrapy:POST请求返回JSON响应(200 OK),但数据不完整 - Scrapy: POST request returning JSON response (200 OK) but with incomplete data Jquery JSONP请求使用数据获得200个响应,但标记错误 - Jquery JSONP request gets 200 response with data but flags error 如何创建没有结构的WCF服务(XML请求和响应) - How to create a WCF Service with no structure (XML request and response) Servlet容器创建Servlet请求/响应对象或HttpServlet请求/响应对象? - Servlet containers create Servlet Request/Response objects or HttpServlet Request/Response objects? 如何使用gziped内容发送HTTP POST请求? - How to send HTTP POST request with gziped content?
粤ICP备14056181号  © 2014-2020 ITdaan.com