2016-05-27 75 views
1

我試圖找出映射我的REST API上的幾個用例的最佳方式。 我有2個資源/實體:用戶和組織REST API - 返回具有不同數據的資源列表

一個組織包含多個用戶(一對多關係)。

我有2個不同的使用情況:

  1. 檢索所有組織的列表,而無需任何用戶(無需在此情況下,用戶數據)
  2. 檢索與所有組織的一個列表中的所有其相關用戶

所以我的第一個映射到GET /api/Organization

什麼是映射的廣義好辦法第二個是REST標準? 我需要在一個請求中獲取所有內容,無法發送新請求以獲取每個組織的用戶列表,因爲性能會很糟糕。

我想到了3種不同的可能性:

1)沿着這些路線的東西:GET /api/Organization/customlist/with-users

我真的不喜歡這個,因爲它不是真正REST標準,並會感到困惑與子資源。

2)使用查詢參數此:GET /api/Organization?getusers=true

這是清潔的,但我也爲我寧願只保留了篩選,分頁查詢參數和排序的目的不喜歡它了。

3)GET機身使用JSON對象,並使用GET /api/Organization兩個用例

然後根據JSON對象我想知道我是否應該得到用戶列表或沒有的內容。我實際上最喜歡這種方法,因爲它允許我爲這兩個請求使用相同的路徑,但是我意識到普遍的共識似乎是在GET請求上使用一個正文的不好的做法,儘管最近似乎有這種做法在使用這種方法的ElasticSearch等流行項目中變得更爲常見。

是否有處理類似案件的標準化的方式?任何其他方式我可能錯過了?我可以把它與任何這些過程的工作,但我想了解的最佳做法是什麼,我相信應該是一個常見的場景東西。

回答

1

我首先想到的是定義組織總是返回用戶數據,讓事情變得簡單和一致。

假設這是不可能的具體原因,您可能會採取的一種方法是針對每種情況使用特定的content types,並允許單個端點支持多種類型 - 因此可以使用一種類型要求在沒有用戶數據的情況下「點亮」組織表示,另一個請求用戶數據的「完整」組織規範。

客戶端可以使用accept headers指定他們想要哪種類型的內容,許多REST的實施庫支持指定的處理程序對給定的內容類型

0

免責聲明:這個帖子應該是評論,而不是答案,而是由於格式/大小問題,我將其作爲答案。

使用選項2進行操作。一旦正確地實現了查看參數參數後,您不必維護查詢參數供以後使用。我還建議不要使用QP,如:getusers=true,但使用通用qp,如?includeChild=users; or ?expand=users

通過這種方式,您可以獲得更多兒童/多層次的主要細節關係的未來證明,例如,如果明天您可能需要用戶下的地址,則可以執行?show(or includeChild)=users,address等等。您還可以包含一個通用擴展值?show=all以包含所有孩子。

另外我假設當你「不」包括組織中的「用戶」時,你可以通過任何方式給予「用戶」的鏈接以響應用戶/客戶端的自動深入。類似:(僞結構)

{ 
Organizations: 
{ 
    Org1: 
    { 
    details.. 
    org1.self link (e.g if anyone just want to fetch one item of organizations) like /organizations/1 
    org1.child1.link i,e /organizations/1/users 

    } 
} 
} 

通過給剛剛在組織細節的子鏈接,默認使用,你可以給一個鏈接,使用者去取孩子的信息。

這就是它如何在一個更好的休息設計。我假設。

0

在REST標準中映射第二個泛化好方法是什麼?

REST並不關心你如何拼寫你的URI。 REST不關心你使用多少個URI。 REST並不關心您用於表示域模型中「相同」實體的多少個不同的URI。

請記住,在REST架構風格中,大多數URI都被發現(而不是書籤/固定)。

但(幾乎)沒有人這樣做。因此,我們按...

很酷的URI不會更改 - 您要小心將REST端點與您的域模型緊密耦合,因爲這會增加修改模型的成本。你應該能夠改進你的域的實現,而不必改變你的API。

因此,我建議你保留你的URI命名空間的一部分,該修改的實體在您的域資源,做你看中的報告中您的命名空間的一個獨立部分

/model/organization/{organizationid} 

vs 

/reports/activeOrganizationsDigest?asOf=2016-05-27 
/reports/activeOrganizations/showUsers?activeSince=2015-12-12 

URI是便宜 ;不要覺得你需要對他們吝嗇。

/userStories?asA=marketingStrategist&iWantTo=reviewCurrentOrganizations&soThat=iCanPlanNewCampaigns 
/userStories?asA=emailScammer&iWantTo?mineEmailAddresses&soThat=iCanBroadcastMoreSpam 

塞西n'est PAS UNE管

該調遣被記錄紙幅的成功的一部分是,從去耦,允許腹板成爲表示提供靈活性的標識符不僅僅是一個靜態的文檔傳輸應用程序。

這首歌的名字叫黑線鱈的眼睛...

這首歌的名字是老年人的中年男子......

歌曲的名字叫途徑和方法......

這首歌是A坐在門上...

Charles Lutwidge Dodgson上的力量decoupling the name from the entity