使用POST創建請求,響應代碼為200或201,內容為

[英]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.

假設我編寫了一個REST服務,其目的是將新數據項添加到系統中。

I plan to POST to

我計划發帖到

http://myhost/serviceX/someResources

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:

我正在查看HTTP響應代碼的定義,並看到這些可能性:

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

200:返回描述或包含動作結果的實體;

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

后者聽起來更符合Http規范,但我一點都不清楚

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

響應應該包括一個包含資源特征和位置列表的實體

means.

手段。

Recommendations? Interpretations?

建議?解釋?

7 个解决方案

#1


9  

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

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

It's just a colon delimited key-value.

它只是一個以冒號分隔的鍵值。

ETag: "xyzzy"

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

在此示例中,所創建項的標識符,uri和類型是“資源特征和位置”。

#2


77  

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

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

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,並且可以選擇刪除或添加其他元素和屬性,或者更改元素內容和屬性值。

#3


36  

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

我們的想法是,響應主體會為您提供一個鏈接到該事物的頁面:

201 Created

201創建

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.

201(已創建)狀態代碼表示已完成請求並已導致創建一個或多個新資源。由請求創建的主要資源由響應中的Location頭字段標識,或者如果沒有收到Location字段,則由有效請求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:

這意味着您將在響應標頭中包含一個位置,該位置提供您可以在哪里找到新創建的內容的URL:

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.

201響應有效負載通常描述並鏈接到創建的資源。

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

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

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

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:

最后是優化,我可以預先緩存創建的資源(因為我已經有了內容;我只是上傳了它)。服務器可以返回一個日期或ETag,我可以存儲我剛剛上傳的內容:

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.

有關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 <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,也可以是遞增的修訂版號。當事物發生變化時會發生任何變化。

#4


21  

Check out HTTP: Method Definitions: POST.

查看HTTP:方法定義: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).

如果在源服務器上創建了資源,則響應應該是201(已創建)並包含描述請求狀態的實體,並引用新資源和Location頭(請參閱第14.30節)。

#5


11  

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或鏈接)時

#6


1  

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.

輸出實際上取決於所請求的內容類型。但是,至少應該放置在Location中創建的資源。就像Post-Redirect-Get模式一樣。

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

在我的情況下,我將其留空,直到另有要求。因為這是使用Response.created()時JAX-RS的行為。

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/

但是,請注意,像Angular這樣的瀏覽器和框架不會自動跟蹤201。我在http://www.trajano.net/2013/05/201-created-with-angular-resource/中注意到了這種行為

#7


-2  

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.

因此,為了更具體地解決上面的問題,我只使用返回代碼200並使返回的消息包含應用程序可以理解的JSON消息。根據您的需要,它可能需要新創建的對象的ID,以便Web應用程序可以在另一個調用中獲取數據。

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.

請注意,在我重構的API合同中,POST響應不應包含任何可緩存的數據,因為POST實際上不可緩存,因此將其限制為可以使用GET請求請求和緩存的ID。


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2009/12/07/7203f7872445d09c40f7622e12a273d5.html



 
粤ICP备14056181号  © 2014-2020 ITdaan.com