web-dev-qa-db-ja.com

1つのリクエストで複数のアイテムを作成するRESTfulな方法

注文を収集するための小さなクライアントサーバープログラムに取り組んでいます。これを「REST(ful)な方法」で行いたいと思います。

私がやりたいことは:

すべての注文ライン(製品と数量)を収集し、完全な注文をサーバーに送信します

現時点では、これを行うための2つのオプションがあります。

  1. 各オーダーラインをサーバーに送信します:POST qty and product_id

サーバーへのリクエストの数を制限したいので、実際にはこれを行いたくないので、オプション2:

  1. すべてのオーダーラインを収集し、それらを一度にサーバーに送信します。

オプション2を実装するにはどうすればよいですか?私が持っているいくつかのアイデアは次のとおりです。すべてのオーダーラインをJSONオブジェクトにラップしてサーバーに送信するか、配列を使用してオーダーラインをポストします。

オプション2を実装するのは良いアイデアですか、それとも良いプラクティスですか?.

良い習慣とは何ですか?

115
Paul

これにアプローチする別の正しい方法は、リソースのコレクションを表す別のリソースを作成することだと思います。たとえば、/api/sheep/{id}のようなエンドポイントがあり、POST to /api/sheepに羊のリソースを作成することができます。

ここで、一括作成をサポートする場合は、/api/flock(または、より意味のある名前がない場合は/api/<your-resource>-collection)で新しいflockリソースを検討する必要があります。 リソースはデータベースやアプリのモデルにマップする必要がないであることを忘れないでください。これはよくある誤解です。

リソースは、データとは関係のない高レベルの表現です。リソースに対する操作には、ユーザーへのアラートの発動、他の関連データの更新、長期間のプロセスの開始など、重大な副作用があります。たとえば、ファイルシステムまたはunix psコマンドとしてREST API。

リソースを操作することは、副作用としていくつかの他のエンティティを作成することを意味する可能性があると想定するのは安全だと思います。

65
miguelcobain

一括操作(バッチ作成など)は多くのシステムで不可欠ですが、RESTfulアーキテクチャスタイルによって正式に対処されていません。

あなたが提案したようにコレクションをPOSTすることは基本的に機能することがわかりましたが、そのようなリクエストに応じて失敗を報告する必要があるときに問題が発生します。さまざまな原因で複数の障害が発生した場合、またはサーバーがトランザクションをサポートしていない場合、このような問題は悪化します。あなたへの私の提案は、パフォーマンスの問題がない場合、たとえば、サービスプロバイダーがLAN(WANではない)上にある場合、またはデータが比較的小さい場合、100 POSTサーバーへのリクエスト:シンプルにして、別々のリクエストから始めて、パフォーマンスに問題がある場合は最適化してみてください。

43
LiorH

Facebookはこれを行う方法を説明しています: https://developers.facebook.com/docs/graph-api/making-multiple-requests

単純なバッチリクエスト

バッチAPIは、JSON配列として表される論理HTTPリクエストの配列を受け取ります-各リクエストにはメソッド(HTTPメソッドGET/PUT/POST/DELETEなどに対応)、relative_url(graph.facebookの後のURLの部分)があります。 com)、オプションのヘッダー配列(HTTPヘッダーに対応)、およびオプションの本体(POSTおよびPUT要求の場合)。バッチAPIは、JSON配列として表される論理HTTP応答の配列を返します-各応答ステータスコード、オプションのヘッダー配列、オプションの本文(JSONエンコードされた文字列)があります。

10
rwitzel

あなたの考えは私にとって有効なようです。実装はあなたの好みの問題です。このためにJSONまたは単にパラメーター( "order_lines []"配列)を使用して、

POST /orders

単一のアクション(オーダーとその行)で一度により多くのリソースを作成するため、すべてを検証し、すべてが検証に合格した場合にのみ保存することが重要です。トランザクションで行う必要があります。

8
Milan Novota

単一接続 内で個別のリクエストを送信する方が良いと思います。もちろん、あなたのウェブサーバーはそれをサポートするべきです

6
zakovyrya

私は実際に最近これと格闘してきました、そして、ここに私が目指しているものがあります。

複数のリソースを追加するPOSTが成功した場合、200 OK(201を検討していましたが、ユーザーは最終的に作成されたリソースに着地しません)と表示されるページを返しますたとえば、ユーザーは、単一のファイル入力のみで構成されるフォームを使用して、ギャラリーに複数の画像を選択してPOSTを選択できます。 POSTリクエストが完全に成功した場合、ユーザーには、作成された各画像リソース表現のフォームのセットが表示され、それぞれの詳細(名前、説明など)を指定できます。

1つ以上のリソースの作成に失敗した場合、POSTハンドラーはすべての処理を中止し、個々のエラーメッセージを配列に追加します。その後、419 Conflictが返され、ユーザーがルーティングされますエラー配列の内容と、送信されたフォームに戻る方法を示す419 Conflictエラーページに移動します。

5
Eric Fuller

100個のオーダーラインのHTTPヘッダーを送信する必要はありません。必要以上の要求を生成する必要もありません。

1つのJSONオブジェクトで注文全体をサーバーに送信します:server/orderまたはserver/order/new。次を指すものを返します:server/order/order_id

使用することも検討してください 作成 POSTの代わりにPUT

0
Cheery