169

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

に投稿する予定です

http://myhost/serviceX/someResources

それが機能すると仮定すると、どの応答コードを使用すればよいでしょうか? そして、どのコンテンツを返すことができますか。

HTTP 応答コードの定義を調べたところ、次の可能性が見えてきました。

200:アクションの結果を記述または含むエンティティを返します。

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

後者の方が Http 仕様に沿っているように聞こえますが、何が原因なのかはまったくわかりません

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

意味。

おすすめは?解釈?

4

7 に答える 7

116

アイデアは、応答本文が、モノにリンクするページを提供するということです。

201 作成済み

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

これは、新しく作成されたものを見つけることができる場所の URL を提供するLocation応答ヘッダーにを含めることを意味します。

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アップロードしたばかりのコンテンツと共に保存できます。

応答のやなどのバリデータ ヘッダー フィールドの意味と目的については、セクション 7.2を参照してください。ETagLast-Modified201

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-256)。ただし、データベースrowversion、または増分リビジョン番号の場合があります。物事が変わると変わるもの。

于 2016-04-02T12:58:34.657 に答える
94

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>

サーバーは、作成の成功をステータス コード 201 で通知します。応答には、Atom エントリのメンバー エントリ 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>

Collection によって作成されて返された Entry は、クライアントによって POST された Entry と一致しない場合があります。サーバーは、atom:id、atom:updated、atom:author の値など、エントリ内のさまざまな要素の値を変更してもよく、他の要素や属性を削除または追加したり、要素の内容や属性値を変更したりすることもできます。

于 2009-12-27T05:58:44.117 に答える
38

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

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

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

于 2014-05-16T20:45:52.117 に答える
18

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、およびタイプが「リソースの特性と場所」です。

于 2009-12-26T06:42:06.310 に答える
1

実際の出力は、要求されているコンテンツ タイプによって異なります。ただし、最低限、作成したリソースは Location に配置する必要があります。Post-Redirect-Get パターンと同様です。

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

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

于 2013-05-03T07:20:58.423 に答える
-1

これに対するもう 1 つの答えは、実用的なアプローチを取り、REST API 契約をシンプルに保つことです。私の場合、REST API をリファクタリングして、JavaScript や XHR に頼ることなく、単純な HTML フォームとリンクだけでテストしやすくしました。

上記の質問をより具体的に説明すると、リターン コード200を使用して、返されたメッセージにアプリケーションが理解できる JSON メッセージを含めます。必要に応じて、Web アプリケーションが別の呼び出しでデータを取得できるように、新しく作成されたオブジェクトの ID が必要になる場合があります。

リファクタリングされた API コントラクトでは、POST は実際にはキャッシュ可能ではないため、POST 応答にはキャッシュ可能なデータを含めないでください。そのため、GET 要求を使用して要求およびキャッシュできる ID に制限してください。

于 2014-07-23T14:49:53.717 に答える