140

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

私がやりたいことは次のとおりです。

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

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

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

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

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

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

オプション 2 を実装するのは良い考えですか、それとも良い習慣ですか? もしそうなら、どのようにすればよいですか?

グッドプラクティスとは?

4

7 に答える 7

89

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

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

リソースは、データとは関係のない上位レベルの表現です。リソースを操作すると、ユーザーへのアラートの発火、他の関連データの更新、長期にわたるプロセスの開始など、重大な副作用が生じる可能性があります。たとえば、ファイル システムや UNIXpsコマンドを REST API としてマップすることもできます。

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

于 2015-11-17T22:20:25.060 に答える
55

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

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

于 2009-01-08T19:40:33.940 に答える
10

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

単純なバッチ リクエスト

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

于 2014-09-16T19:18:45.123 に答える
8

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

POST /orders

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

于 2009-01-04T20:23:09.583 に答える
-3

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

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

POSTの代わりにCREATEPUTの使用も検討してください

于 2009-01-04T20:04:14.940 に答える