2015-10-02 18 views
2

什麼是適當的REST兼容方法,允許客戶調用RESTful服務以將(大)文檔轉換爲目標格式?對於文件轉換服務,什麼是有效的REST方法?

我想類似這樣的東西:

  1. 客戶端發出一個POST/conversion/request資源與轉換配置(目標類型,安全密鑰,通知資源URL形式http://host_to_be_notified/notification/status/id)將返回一個請求ID 。轉換請求將被添加到內部隊列中,只要轉換未開始,客戶端就可以修改/刪除轉換請求。
  2. 一旦轉換開始/conversion/request/id由服務器
  3. 一旦轉換完成後,服務器創建一個/conversion/result/id資源(同樣在1如上ID),那麼就在通知狀態資源PUT(設置它刪除,以「準備就緒」,並提供關鍵),這將通知其請求的完成客戶端
  4. 當準備好客戶端發出的/conversion/result/id資源GET獲得轉換後的文檔
  5. 如果客戶因任何原因去下線,他可以嘗試檢索4中的結果。如果文檔沒有準備好,客戶端只需等待發送通知。

但是......

  1. 它是一個有效的方法?
  2. 我應該忘記使用REST,而應該考慮使用SOAP(並且有阻止調用,知道我寧願避免阻塞調用)或JMS(所有方法都有其優點/缺點,以及對JMS的一個重大缺點在我的上下文中,它需要爲可能被拒絕的所有客戶端設置隊列)(注意:這就是爲什麼我還爲此問題添加了「SOAP」和「JMS」標籤)
  3. 任何有關如何改進在進一步研究之前我應該​​考慮哪些問題?

在此先感謝您的幫助!

米歇爾

回答

0

我只用這樣一個單一的資源:

POST /conversion/ {meta} {attachment} - >201 created {links: [{rel: "self", href: "/conversion/1"}]}

,轉換表示將包含屬性像這樣在不同狀態下的鏈接後:

排隊

{ 
    id: 1, 
    status: "enqueued", 
    links: [ 
     {rel: "self", href: "/conversion/1"}, 
     {rel: "remove", href: "/conversion/1"}, 
     {rel: "status-change", href: "/conversion/1/status/events"} 
    ] 
} 

加工

{ 
    id: 1, 
    status: "processing", 
    percent: 99, 
    links: [ 
     {rel: "self", href: "/conversion/1"}, 
     {rel: "status-change", href: "/conversion/1/status/events"}, 
     {rel: "percent-change", href: "/conversion/1/percent/events"} 
    ] 
} 

完全

{ 
    id: 1, 
    status: "complete", 
    links: [ 
     {rel: "self", href: "/conversion/1"}, 
     {rel: "result", href: "/conversion/1/file"} 
    ] 
} 

status-changepercent-change可以使用SSE,輪詢或WebSockets向數據推回或觸發更新。 OFC。這只是一個草案。

4

在過去我已經處理了這個與用於初始請求的POST,返回一個URI與最終文檔作爲有效載荷的位置。然後,我回應GETS在該位置的響應HTTP 202,直到處理完成。處理完成後,我會返回HTTP 200和內容。這最大限度地減少了客戶端的複雜性(這是一個簡單的輪詢),並且保持與HTTP語義的一致性。

如果你確實想要實現回調方法,那麼可以,但是它增加了很大的複雜度,我無法想象它在另一端簡化了事情。輪詢過程使他們可以更自由地執行嘗試/等待循環或將位置轉儲到表/隊列進行批處理。

最後,這種方法顯着簡化了錯誤處理。您始終可以在客戶端所做的同一個GET上返回500錯誤。您不必爲不同的錯誤條件指定不同的回調函數(最終成爲您的API的真正痛點)。

+0

感謝您的回答。我的錯誤:我在考慮通知,而不是真正的回調。服務器試圖盡最大努力修改狀態,如果客戶端無法訪問,服務器沒有特殊要求。我想避免投票,因爲我寫的JMS可能不被接受(恕我直言,恕我直言,但我希望能夠提供一個可行的儘可能聰明的選擇)。我根據這個答案修改了我的帖子。 – Kraal

相關問題