2017-09-07 2 views
1

REST POSTはリソースの作成に使用されます。REST POSTリクエストの途中でネットワーク接続の切断を処理するにはどうすればよいですか?

は、我々は我々は新しい車を作成したいリソースのURLに 「http://example.com/cars

があるとしましょう。 車のプロパティ(色、重量、モデルなど)を含むJSONペイロードで "http://example.com/cars"にPOSTします。

サーバは、が新しい車を作成し、ネットワークを介して応答を送信する要求を受信します。

この時点でネットワークに障害が発生しました(ルータは正常に動作しなくなり、すべてのパケットを無視します)。

クライアントはTCPタイムアウト(90秒など)で失敗します。 クライアントが作成したかどうか車が作成されているかどうか また、クライアントは車のリソースIDを受け取っていないため、作成されたかどうかを確認するためにGETできません。

今何ですか? これはどのように処理しますか? 作成を再試行することはできません。再試行すると重複が作成されるだけです(悪い)。

答えて

0

リソースを作成するためにREST POSTが使用されます。

HTTP POSTは多くのものに使用されます。 RESTは特に気にしません。一様なインターフェースとハイパーメディアをサポートするリソースが必要なだけです。

この時点でネットワークが

残念に失敗しました!

今何ですか?これはどうやって扱いますか?再試行は重複を作成するだけなので、簡単に作成をやり直すことはできません。

これはRESTに直接関係しない一般的なメッセージングの問題です。最も一般的な解決策は、Idempotent Receiverパターンを使用することです。要するに、 は、受信者が要求を既に完了したものとして認識するのに十分な情報を持つようにメッセージを定義する必要があります。

理想的には、これはbusiness levelでサポートされています。

等価の値の集合は、しばしば単純です。我々はちょうどリストよりもを設定すると思う必要があります。

多数のエンティティの集団はトリッキーです。要求に新しいエンティティの識別子が含まれている場合、または提供されたデータから要求を計算できる場合は、コレクションをハッシュと考えることができます。

これらのアプローチのいずれも適合しない場合、別の可能性があります。コレクションの等価な突然変異を実行する代わりに、コレクション自体の突然変異を冪等化します。 「比較して交換する」と考える - コレクションの現在の状態を識別するリクエスト情報をエンコードします。要求が到着したときに状態がまだ最新である場合、突然変異が適用されます。条件が成立しない場合、要求はノーオペレーションになります。

これをHTTPに変換すると、コレクションリソースを更新するためのプロトコルが少し変更されます。まず、現在の表現を取得します。メタデータでは、サーバーはサブクエリ要求で使用できるvalidatorsを提供します。バリデータを取得すると、クライアントはリソースの現在の表現を評価して、変更が必要かどうかを判断します。クライアントが変更を決定した場合、If-MatchまたはIf-Unmodified-Sinceヘッダー(バリデーターを含む)で変更を送信します。要求を処理する前にサーバーは、バリデータを考慮して、すぐに要求を放棄します。412 Precondition Failed

したがって、条件付きの状態変更要求が失われた場合、クライアントはクライアントの意図を誤解することなく、クライアントが独自の裁量で要求を繰り返すことができます。

0

試行間の遅延が長くなるように制限して再試行し、関連するトランザクションが冪等であることを確認してください。

再試行すると重複が作成されるだけなので(悪い)

これは確かに、上記を参照してください。同じ属性を持つ2つのエントリを作成することは、システムでは不可能です。これは、データベースレベルで簡単に実行できます。エントリが既に存在していても新しく作成されたものであっても、トランザクションが同じことを返すことで、冪等性を得ることができます。または、エントリがすでに存在する場合はEXISTSを返し、それに応じてクライアントを調整してください。

関連する問題