5

POST(またはその他のべき等でない動詞)が成功するかどうかを判断するためのRESTfulな方法はありますか?これは、基本的に異なるサービスに対して複数のべき等要求を行う必要があり、そのいずれかが失敗する可能性がある場合に役立つように思われます。これらのリクエストを「トランザクション」で(つまり、ロールバックをサポートして)実行できると便利ですが、これは不可能であるため、実際に実行する前に、各リクエストが成功するかどうかを確認することもできます。

たとえば、カスタムテキストが印刷されたTシャツを購入できるeコマースシステムを構築しているとします。このシステムでは、Tシャツ印刷サービスと支払いサービスの2つの異なるサービスを統合する必要があります。これらにはそれぞれRESTfulAPIがあり、どちらも失敗する可能性があります。(たとえば、印刷会社がTシャツに特定の単語を印刷することを拒否し、クレジットカードの有効期限が切れている場合、銀行が文句を言う可能性があります。)これら2つの要求を投機的に実行する方法はありますか?両方のリクエストが有効と思われる場合は?

そうでない場合、この問題は別の方法で解決できますか?POSTwithを使用してリソースを作成し、これをすべてのリクエストが成功した場合status = pendingに変更しますか?status = completeDELETEもっとトリッキーです...)

4

2 に答える 2

2

HTTPは、シナリオにぴったりの202ステータスコードを定義します。

202承認済み

リクエストは処理のために受け入れられましたが、処理は完了していません。リクエストは、実際に処理が行われるときに許可されない可能性があるため、最終的に処理される場合とされない場合があります。このような非同期操作からステータスコードを再送信する機能はありません。

202の応答は、意図的に非コミットです。その目的は、サーバーへのユーザーエージェントの接続がプロセスが完了するまで持続することを必要とせずに、サーバーが他のプロセス(おそらく、1日に1回だけ実行されるバッチ指向のプロセス)の要求を受け入れることができるようにすることです。この応答で返されるエンティティには、要求の現在のステータスの表示と、ステータスモニターへのポインター、またはユーザーが要求の実行を期待できる時期の見積もりが含まれている必要があります。

出典:HTTP1.1ステータスコード定義

これは201Createdと似ていますが、リクエストが完了しておらず、エンティティがまだ作成されていないことを示している点が異なります。応答には「注文リクエスト」を表すリソースへのURLが含まれるため、クライアントはこのURLを介して注文のステータスを確認できます。


あなたの質問にもっと直接的に答えるには:あなたは千里眼を求めているので、あなたがそれをする前に要求が成功するかどうかを「テスト」する方法はありません。

将来、リクエストを行おうとしたときに発生する可能性のあるさまざまな技術的な問題を予測することはできません。ネットワークが利用できない可能性があり、サーバーがデータベースまたは機能するために依存している外部システムにアクセスできない可能性があります。停電が発生し、サーバーがオフラインになっている可能性があります。漂遊ニュートリノがメモリに迷い込んで0にぶつかる可能性があります。 1にすると、壊滅的なカーネル障害が発生します。

リモートサービスを利用するには、他のプロセスとは別に、リクエストの失敗の可能性を考慮する必要があります。

特定の問題については、サービスにトランザクションの安全性がない場合、そこで何もベイクすることはできず、より現実的な方法でこれに対処する必要があります。私の頭のてっぺんからいくつかのオプション:

  1. Tシャツ会社に「テスト」メカニズムを提供してもらうと、実際に注文しなくても、特定の注文を処理できるかどうかを確認できます。彼らとの注文は2段階の操作である可能性があります。この操作では、最初の段階で注文を作成し(その時点で、彼らはその作成を検証します)、その後、注文を処理するように依頼します(支払いを受け取った後)。正常に)。

  2. 最初にクレジットカードで支払いを行い、注文を「支払い済み」の状態に移行します。次に、非同期プロセスとしてTシャツサービスを使用して注文を処理しようとします。フルフィルメントが失敗し、顧客が何かを印刷しようとしたことが会社が作成する準備ができていないことを確認できる場合は、注文を変更するか払い戻しを行うために顧客に連絡する必要があります。

ほとんどの組織は、技術的な単純さとビジネスへのリスクの低減のために、2番目のアプローチを採用します。また、利用できないTシャツサービスに対応できるという利点もあります。非同期プロセスは、サービスが利用可能になるまで待機し、その時点で注文を完了するだけです。

于 2012-04-17T17:04:25.337 に答える
1

その通り。それはあなたが最後の文で示唆するように行うことができます。アイデアは、後で決定できる「注文受付」の「進行中の要求」を表すリソース作成(ネットワーク障害が発生しない限り常に機能する)をデコピーすることです。POSTは「Location」ヘッダーを返すため、リクエストの「ステータス」をいつでも取得できます。

ある時点で、受け入れられるか拒否される可能性があります。これは瞬時に行われる場合もあれば、時間がかかる場合もあるため、これらの制限を使用してサービスを設計する必要があります(つまり、クライアントが注文が受け入れられたかどうかを確認できるようにするか、受け入れられた要求を収集するある種の時間/日サービスを実行します)。 。

于 2012-04-17T16:39:17.583 に答える