1. ホーム
  2. rest

[解決済み] レスポンスコードが200または201で、内容がPOSTのリクエストを作成します。

2022-04-23 08:37:48

質問

私が新しいデータ項目をシステムに追加することを意図したRESTサービスを書くとします。

にPOSTする予定です。

http://myhost/serviceX/someResources

仮にうまくいったとして、どのようなレスポンスコードを使えばいいのでしょうか?また、どのようなコンテンツを返せばよいのでしょうか。

私が見ているのは 定義 HTTP レスポンスコードに、このような可能性を見出すことができます。

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

201:CREATEDを意味する。意味 *リクエストが実行され、新しいリソースが作成されました。新しく生成されたリソースは、Locationヘッダーフィールドで与えられたリソー スの最も具体的なURIを持つ、応答のエンティティで返されたURIによって参照する ことができる。応答は、ユーザーまたはユーザーエージェントが最も適切なものを選択できるような リソースの特性とロケーションのリストを含むエンティティを含むべきである [SHOULD]。エンティティの形式は、Content-Typeヘッダーフィールドで与えられたメディア タイプによって指定される。*

後者の方がHttp仕様に沿った内容になっているような気がしますが、何がどうなっているのか全く不明です。

レスポンスには リソースのリストを含む 特性および位置

を意味します。

推奨?解釈?

解決方法は?

レスポンスボディから、そのモノにリンクするページが与えられるというものです。

201 作成

201 (Created) ステータスコードは、リクエストが実行され、1つまたは複数の新しいリソースが作成されたことを示します。 リクエストによって作成されたプライマリリソースは Location ヘッダーフィールドがない場合、または Location フィールドを受信した場合、有効なリクエスト URI で指定します。

これはつまり 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-Modified の中にある。 201 のレスポンスになります。

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 は純粋に任意の値です。リソースが変更されたとき (そしてキャッシュが更新される必要があるとき) に、それらが異なるということが重要なのです。そのため ETag は通常ハッシュ(例:SHA2-256)です。しかし、それはデータベースであることもできます rowversion または、インクリメントされるリビジョン番号。以下のようなものはすべて 変化 を実行したとき もの を変更します。