2010-11-02 22 views
4

假設您在REST API中有一個複雜的資源。您在此資源上有幾個一對多標誌和屬性(即用戶可能已給予該資源的評分爲1至5或用戶可能已'喜歡'該資源或將其標記爲垃圾郵件或將其忽略或引起一些其他國家將被設置)。在REST API中處理標誌和屬性的選項有哪些?

對於以資源爲中心的體系結構來表示這一點的最佳方式提出了一些建議,但到目前爲止,沒有一個能夠讓我真正感到高興。所以讓我們來分析一下這個問題。你發現哪些變體最容易理解?我們沒有想到哪些變體?假設一個基於OAuth的API和這裏的所有內容都是在當前授權用戶的上下文中完成的。

  • 布爾標誌

    • 變型1:

       
      GET /resource/{id}/muted 
      POST /resource/{id}/muted BODY:true 
      POST /resource/{id}/muted BODY:false 
      
    • 變體2:

       
      GET /resource/{id}/muted 
      PUT /resource/{id}/muted BODY:true 
      DELETE /resource/{id}/muted 
      
    • 變體3:

       
      GET /resource/{id}/attributes 
      POST /resource/{id}/attributes BODY:muted=true 
      POST /resource/{id}/attributes BODY:muted=false 
      
    • 變體4:

       
      GET /resource/{id}/muted 
      POST /resource/{id}/mute 
      POST /resource/{id}/unmute 
      
  • 屬性

    • 變體1

       
      GET /resource/{id}/rating 
      POST /resource/{id}/rating BODY:4 
      
    • 變體2:

       
      GET /resource/{id}/rating 
      PUT /resource/{id}/rating BODY:4 
      DELETE /resource/{id}/rating 
      
    • 變3:

       
      GET /resource/{id}/attributes 
      POST /resource/{id}/attributes BODY:rating=4 
      POST /resource/{id}/attributes BODY:rating= 
      

的思考?建議?其他API如何處理?你是怎麼處理它的?您是否發現這樣的設計問題對開發人員的幸福感或API的易用性有重大影響?

回答

6

Roy's dissertation來自:

一個統一的接口降低效率,因爲信息是在標準化的形式,而不是一個,其是特定於應用程序的需求轉移。REST接口的設計是高效的爲大粒超媒體數據傳輸

所以你需要一個變種5,其同時適用於標誌和其他屬性:

GET /resource/{id}/ BODY:{muted: false, like: false, rating: 2, ignored: true} 
POST /resource/{id}/ BODY:{muted: true, like: false, rating: 2, ignored: true} 
POST /resource/{id}/ BODY:{muted: false, like: false, rating: 2, ignored: true} 

一個大原因是,大多數的一個RESTful HTTP應用程序的效率來自緩存,當它的工件儘可能大時,以及儘可能少的標識符可訪問數據時,該應用程序效果最佳。如果您在/resource/{id}//resource/{id}/muted處公開「靜音」標誌,則表明您有緩存失效問題。如果您僅在/resource/{id}/處公開它,那麼您不會。

如果你正在設計一個應用程序,通過小型有效載荷的目的是爲效率,那麼你就無法從種糧大戶的緩存中受益,剩下的建築風格是不是適合你的應用程序。 HTTP可能不是,但我可以理解某人在今天的市場中會如何被卡住。

+0

那麼,這實際上是變種3,但與「application/json」有效載荷,而不是「應用程序/ x-www-form-urlencoded」有效載荷。相同的基本思想,但'application/x-www-form-urlencoded'更適合部分更新資源。 – 2010-11-02 06:59:20

+0

另外,因爲一切都在OAuth後面,所以緩存參數比平常弱一些。接收端的客戶端可以緩存,並且肯定該緩存在更大的資源下效率更高。然而,從開發人員的角度來看,95 +%一次只會改變一個屬性,並且不會假定發送給服務器的數據主體將與您在收到時立即產生GET一致。這可能會消除'PUT'作爲一個選項,擴展名'DELETE'。我對此很滿意,因爲那是我最不喜歡的解決方案。 – 2010-11-02 07:03:24

+0

至於緩存失效,說相關應用程序只能最大限度地減少這個問題,而不是消除它是非常安全的。這就是生活的規模。 – 2010-11-02 07:10:10

0

我喜歡變3,如果我可以一次提供了一堆 - 否則,我很冷漠1和3

而且,使用DELETE絕對之間什麼都沒有。

+0

是的,我應該使人們更清楚地表明變3'應用程序/ x-WWW的形式urlencoded'。 – 2010-11-02 07:00:04