93

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

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

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

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

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

4

5 に答える 5

98

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

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

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

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

于 2009-12-02T00:23:18.290 に答える
16

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

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

  1. それを作成するために物を投稿する
  2. 2つのことを知るのに十分な応答をします。
    1. 創造が起こったこと(201)
    2. 新しいものを見つける場所(Locationヘッダー)

それ以外は不要です。

于 2009-12-06T23:51:35.113 に答える
10

2つの異なる質問:

RESTアプリケーションパターンは、POSTでのデータの返送をサポートしていますか?

RESTが明示的にそれを禁止しているとは思いませんが、Darrelの回答に好ましい扱いが明記されています。

RESTletフレームワークでは、POSTでデータを返すことができますか?

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

于 2009-12-02T01:11:38.893 に答える
6

要求された形式で出力します。それは次のようになります。

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

または:

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

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

于 2009-12-02T00:19:04.517 に答える
1

201 Created with the entity bodyではなく、Locationリダイレクトで応答する場合は、応答で表されているリソースを指す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>
于 2009-12-02T10:32:53.420 に答える