2012-12-13 38 views
8

雖然研究異步操作我碰到下面的設計模式運行基於REST的API:REST:HTTP 303是否被認爲對異步操作有害?

POST uri:longOperation回報:

  • HTTP 202
  • 地點:URI:pendingOperation

GET uri:pendingOperation回報:

  • 如果正在運行操作
    • 返回進度報告。
  • 如果操作完成
    • HTTP 303
    • 位置:URI:operationResponse

GET uri:operationResponse

  • 的非同步的響應ronous operation

我發現最後一步有問題。考慮一下如果異步操作完成時發生的錯誤代碼對HTTP GET沒有意義,比如HTTP 409 ("Conflict")

  1. 是不是HTTP 303需要指向與URI相關聯的應答:pendingOperation,而不是URI:operationResponse
  2. 正在使用HTTP 303這樣認爲有害嗎?如果不是,爲什麼?
  3. 這是我們能做的最好的,還是有更好的方法?

回答

6

指向與URI相關聯的反應是不是HTTP 303要求:pendingOperation而不是URI:operationResponse?

spec沒有明確表示它是必需的,但我傾向於同意你的看法。

正在使用HTTP 303這種方式認爲有害嗎?如果不是,爲什麼?

我認爲你失去了一個303的能力。儘管自動重定向完成後「很好」,但它使得你沒有機會在結果周圍提供元數據,可以用於報告等......還有很多客戶端不會自動跟蹤303,因此客戶端可能需要按照303位置標題進行工作。

這是我們能做的最好的,還是有更好的方法?

我傾向於建議讓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", 
     } 
    ] 
}