web-dev-qa-db-ja.com

RESTでPOST後にコンテンツを返すことで大丈夫ですか?

RESTletを使用しており、リソースを作成しました。 acceptRepresentationメソッドをオーバーライドして、POST=)を処理します。

クライアントはいくつかのデータを送信し、それをDBに保存し、応答を201(SUCCESS_CREATED)に設定し、クライアントにデータを返す必要がありますが、acceptRepresentationの戻り型はvoidです。

私の場合、クライアントがそのリソースにアクセスできるように、何らかの識別子を返す必要があります。

たとえば、URLが/resourceのリソースがあり、クライアントがPOST要求を送信した場合、DBに新しい行を追加すると、そのアドレスは/resource/{id}になります。 {id}を送信します。

私は何か間違っていますか? REST原則により、POST後に何かを返すことができますか?はいの場合、どのように行うことができ、いいえの場合、この状況を処理する方法は何ですか?

80
del-boy

RESTは、統一されたインターフェイスに準拠する必要があるとだけ言っています。つまり、POSTが HTTP仕様 に従って行うことになっていることを行う必要があります。ここに関連するその仕様からの引用を示します。

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

これからわか​​るように、新しく作成されたリソースが存在する場所をクライアントに示すことができる2つの場所があります。 Locationヘッダーには、新しいリソースを指すURLが必要です。また、詳細を含むエンティティを返すことができます。

AcceptRepresentation()のオーバーライドとpost()のオーバーライドの違いはわかりませんが、 this の例はPOSTから応答を返す方法を示しています。

87
Darrel Miller

応答の本文にあるものを送信することはありません。 Location:を、新しく作成されたリソースの(完全な)URLに設定するだけです。

あなたの説明は、これがまさにあなたのセマンティクスであることを示唆しています。

  1. 作成するものを投稿する
  2. 次の2つのことを十分に理解して対応してください:
    1. 創造が起こったこと(201)
    2. 新しいものの場所(Locationヘッダー)

それ以外は不要です。

14
cdent

2つの異なる質問:

RESTアプリケーションパターンはPOSTでデータを返すことをサポートしますか?

RESTは明示的にそれを禁止しているとは思わないが、望ましい治療法はDarrelの答えに詳述されている。

RESTletフレームワークはPOSTでデータを返すことを許可しますか?

はい、voidを返しますが、Resourceを拡張するクラスでは、getResponse()メソッドを介してResponseオブジェクトオブジェクトに完全にアクセスできます。したがって、任意のデータを使用してgetResponse()。setEntity()を呼び出すことができます。

10
Thom

要求された形式で出力します。それは:

<success>
    <id>5483</id>
</success>

または:

{ "type": "success", "id": 5483 }

それは通常何をするかによります。データを期待していない場合は、単にそれを無視する必要がありますが、適切に処理したいクライアントはできるはずです。

6
Samir Talwar

Location Redirectではなく、Entity Bodyで201 Createdに応答する場合、応答で表されているリソースを指すContent-Locationヘッダーを含めることをお勧めします。

これにより、潜在的な混乱を回避できます。クライアントは、(正当に)応答エンティティが、作成されたリソースではなく、「作成者」の新しい状態を実際に表すと想定できます。

> POST /collection
> ..new item..

< 201 Created
< Location: /collection/1354
< Content-Location: /collection/1354
< <div class="item">This is the new item that was created</div>
1
Mike