web-dev-qa-db-ja.com

応答コード200または201およびコンテンツを含むPOSTを使用して要求を作成します

システムに新しいデータ項目を追加することを目的とするRESTサービスを作成するとします。

POSTする予定です

http://myhost/serviceX/someResources

それが機能すると仮定すると、どの応答コードを使用する必要がありますか?そして、どのコンテンツが返される可能性があります。

HTTP応答コードの definitions を見て、これらの可能性を確認しています:

200:アクションの結果を説明または含むエンティティを返す;

201:CREATEDを意味します。意味*リクエストが満たされ、新しいリソースが作成されました。新しく作成されたリソースは、応答のエンティティで返されるURIで参照できます。リソースの最も具体的なURIは、Locationヘッダーフィールドで指定されます。レスポンスには、ユーザーまたはユーザーエージェントが最も適切なものを選択できるリソースの特性と場所のリストを含むエンティティを含める必要があります。エンティティ形式は、Content-Typeヘッダーフィールドで指定されたメディアタイプによって指定されます。 *

後者はHttp仕様に沿ったものに聞こえますが、何がはっきりしていないのですか

応答には、リソースの特性と場所のリストを含むエンティティを含める必要があります。

手段。

推奨事項解釈?

102
djna

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

コロンで区切られたKey-Valueです。

ETag: "xyzzy"

任意のタイプのテキストデータを使用できます。通常、作成されたアイテムの識別子にJSON文字列を含めます。テストの容易さだけでも、それを含める価値があります。

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

この例では、作成されたアイテムの識別子、URI、およびタイプが「リソースの特性と場所」です。

13
tempire

atompub REST AP​​I は安らかなサービスの良い例だと思います。 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で作成が成功したことを通知します。応答には、AtomエントリのMember Entry URIを示すLocationヘッダーと、応答の本文内のそのエントリの表現が含まれます。

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>

コレクションによって作成および返されたエントリは、クライアントによってPOSTされたエントリと一致しない場合があります。サーバーは、atom:id、atom:updated、atom:authorの値など、エントリ内のさまざまな要素の値を変更できます。また、他の要素と属性を削除または追加したり、要素のコンテンツと属性値を変更できます。

85
Chandra Patni

アイデアは、レスポンスの本文が、あなたをThingにリンクするページを提供するというものです。

201作成済み

201(作成済み)ステータスコードは、要求が満たされ、1つ以上の新しいリソースが作成されたことを示します。要求によって作成されたプライマリリソースは、応答のLocationヘッダーフィールドによって、またはLocationフィールドが受信されない場合は有効な要求URIによって識別されます。

つまり、Locationを応答ヘッダーに含めて、どこで新しく作成されたthingを見つけます:

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

応答本文

次に、応答に含めるべき内容bodyについて言及します。

通常、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"
   ]
}

応答は完全にあなた次第です。あなたが望むものはwhat意的です。

キャッシュフレンドリー

最後に、作成したリソースを事前にキャッシュできる最適化があります(既にコンテンツがあるため、アップロードしただけです)。サーバーは、アップロードしたコンテンツとともに保存できる日付または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 <A href="/a/36373586/12597">here</A> to view it.

そしてETagsは純粋に任意の値です。重要なのは、リソースが変更された(およびキャッシュを更新する必要がある)ときにそれらを変えることだけです。通常、ETagはハッシュ(SHA2など)です。ただし、データベースrowversion、または増分リビジョン番号を使用できます。 thingが変更されたときにchangeになるもの。

61
Ian Boyd

いくつかの言葉で:

  • 2オブジェクトが作成されたときおよびが返された
  • 201オブジェクトが作成されたが、その参照のみが返された場合(IDやリンクなど)
30

HTTP:メソッド定義:POST を確認してください。

POSTメソッドによって実行されるアクションは、URIで識別できるリソースにならない場合があります。この場合、応答に結果を説明するエンティティが含まれているかどうかに応じて、200(OK)または204(No Content)が適切な応答ステータスです。

Originサーバー上でリソースが作成されている場合、応答は201(作成済み)である必要があり、リクエストのステータスを説明し、新しいリソースを参照するエンティティとLocationヘッダーを含む必要があります(セクション14.30を参照)。

28
ma11hew28

出力は、実際には要求されているコンテンツタイプに依存しています。ただし、少なくともロケーションに作成されたリソースを配置する必要があります。 Post-Redirect-Getパターンと同じです。

私の場合、別の方法で要求されるまで空白のままにします。これは、Response.created()を使用するときのJAX-RSの動作であるためです。

ただし、Angularのようなブラウザとフレームワークは201に自動的に追従しないことに注意してください。 http://www.trajano.net/2013/05/201-created-with-angular-resource/ の動作に注意しました

1