POSTまたはPATCHメソッドを使用してこれを処理できると思います。これは、通常、この方法で設計されているためです。
POST
メソッドの使用は、通常、リストリソースで使用されるときに要素を追加するために使用されますが、このメソッドのいくつかのアクションをサポートすることもできます。この回答を参照してください:RESTリソースコレクションを更新する方法。入力に対してさまざまな表現形式をサポートすることもできます(それらが配列または単一の要素に対応している場合)。
この場合、更新を説明するためにフォーマットを定義する必要はありません。
PATCH
対応するリクエストは部分的な更新に対応するため、メソッドの使用も適しています。RFC5789(http://tools.ietf.org/html/rfc5789)によると:
ハイパーテキスト転送プロトコル(HTTP)を拡張するいくつかのアプリケーションには、部分的なリソース変更を行う機能が必要です。既存のHTTP PUTメソッドは、ドキュメントの完全な置換のみを許可します。この提案は、既存のHTTPリソースを変更するために、新しいHTTPメソッドPATCHを追加します。
この場合、部分的な更新を説明するためにフォーマットを定義する必要があります。
私は、この場合だと思います、POST
そしてPATCH
あなたが本当に各要素に対して実行する操作を記述する必要はありませんので、非常によく似ています。送信する表現の形式に依存すると思います。
の場合PUT
は少し明確ではありません。実際、メソッドを使用するPUT
場合は、リスト全体を提供する必要があります。実際のところ、リクエストで提供される表現は、リストリソース1の代わりになります。
リソースパスに関しては2つのオプションがあります。
この場合、リクエストで提供する表現に、バインダーとドキュメントのリンクを明示的に提供する必要があります。
これはこのためのサンプルルートです/docs
。
このようなアプローチの内容は、メソッドの場合がありますPOST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
さらに、ドキュメントとバインダー間のリンクを記述するためにサブルートを活用することを検討することもできます。ドキュメントとバインダーの関連付けに関するヒントを、要求コンテンツ内で指定する必要がなくなりました。
これはこのためのサンプルルートです/binder/{binderId}/docs
。この場合、メソッドを使用してドキュメントのリストを送信するPOST
か、ドキュメントが存在しない場合は、ドキュメントを作成した後にPATCH
IDを付けてバインダーにドキュメントを添付binderId
します。
このようなアプローチの内容は、メソッドの場合がありますPOST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
応答に関しては、応答のレベルと返すエラーを定義するのはあなた次第です。ステータスレベル(グローバルレベル)とペイロードレベル(シンナーレベル)の2つのレベルが表示されます。また、リクエストに対応するすべての挿入/更新をアトミックにする必要があるかどうかを定義するのはユーザーの責任です。
この場合、HTTPステータスを利用できます。すべてがうまくいくと、ステータスが表示されます200
。そうでない場合は、400
提供されたデータが正しくない(たとえば、バインダーIDが無効である)などの別のステータス。
この場合、ステータス200
が返され、何が行われ、最終的にどこでエラーが発生するかを説明するのは、応答の表現次第です。ElasticSearchのREST APIには、一括更新用のエンドポイントがあります。これにより、このレベルでいくつかのアイデアが得られます:http : //www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html。
提供されたデータを処理するための非同期処理を実装することもできます。この場合、HTTPステータスの戻りはになります202
。クライアントは、何が起こるかを確認するために、追加のリソースをプルする必要があります。
終了する前に、OData仕様がナビゲーションリンクという名前の機能を持つエンティティ間の関係に関する問題に対処していることにも注目したいと思います。多分これを見ていただけますか;-)
次のリンクも役立ちます:https : //templth.wordpress.com/2014/12/15/designing-a-web-api/。
それがあなたを助けることを願っています、ティエリー
GET /docs
取得するには、特定のバインダー内のすべてのドキュメントを呼び出して取得しますGET /docs?binder_id=x
。リソースのサブセットを削除するには、私は呼ぶだろうDELETE /docs?binder_id=x
か、私が呼び出す必要がありますDELETE /docs
と{"binder_id": x}
リクエストボディで?PATCH /docs?binder_id=x
バッチ更新に使用したりPATCH /docs
、ペアを渡したりすることはありますか?