2012-12-13 4 views
8

私は、次のデザインパターンに出くわしました非同期操作のためのRESTfulなAPI研究中:pendingOperation REST:HTTP 303は非同期操作に有害であると見なされますか?

GET uri:pendingOperationリターン:

POST uri:longOperationリターン:

  • HTTP 202
  • 場所:URIを:

    • 操作が実行されている場合
      • 進捗レポートを返します。
    • 操作が完了している場合
      • HTTP 303
      • 場所:URI:operationResponse

    GET uri:operationResponse

    • 非同期の応答騒々しい操作

    最後のステップは疑わしいです。非同期操作がHTTP GETの意味を持たないエラーコード(例えば、HTTP 409 ("Conflict"))で完了したらどうなるかを考えてください。

    1. URIに関連付けられた応答を指すように必要HTTP 303されていません。operationResponseURIとは対照的に、pendingOperation
    2. このようにHTTP 303を使用しているとは有害ですか?そうでない場合、なぜですか?
    3. これが最善の方法ですか、それとも良い方法がありますか?

答えて

6

はHTTP 303は、UR​​Iに関連付けられた応答を指すように要求されていません。pendingOperation URIとは対照的に、:operationResponseを?

specは、明示的には必須ではないと言いますが、私はあなたに同意する傾向があります。

このようにHTTP 303を使用しているとは有害ですか?そうでない場合、なぜですか?

私は303を実行することで機能を失うと思います。完了すると自動リダイレクトするのは「いい」ですが、結果の周りにメタデータを提供する機会がないようになります。レポートなどのために活用することもできます。また、多くのクライアントは303を自動的にフォローしませんので、クライアントは303 Locationヘッダーに従うために作業を行う必要があります。

これは最善の方法ですか、それとも良い方法ですか?

GET uri:pendingOperationリターン200のステータスリソースは、「完了」時には常に出力を参照することをお勧めします。

ような何かすると不完全

{ 
    "status" : "PENDING" 
} 

エラー

{ 
    "status" : "COMPLETE" 
    "errors" : [ 
     { 
      "typeId" : "OPERATION_TIMEOUT", 
      "description" : " "The request was unable to complete because the systems are unresponsive". 
     } 
    ] 
} 

成功

{ 
    "status" : "COMPLETE" 
    "links" : { 
     "result" : { 
      "href" : "http://api.example.com/finished-resource/1234", 
     } 
    ] 
} 

関連する問題