2014-10-17 31 views
4

說我有兩個收集資源:休息 - 關係方面

/persons 
/organizations 

一個GET/persons/id/返回一個特定的人。同樣,GET/organizations/id會返回特定的組織。

一個人可以是一個或多個組織的成員。在這種關係的背景下,我們有諸如組織中人員的角色,加入組織的人的日期等數據......

哪種設計最有意義?

  1. 一個會員資源/memberships/id,到一個GET返回的關係方面的數據(一個鏈接到人與組織一起)。

  2. A /persons/id/organizations/id/organizations/id/persons/id。 A GET給兩個之一返回關係上下文,一個GET到另一個重定向(http狀態碼303)到另一個。

  3. 還有其他的東西嗎?

回答

1

另一種選擇是將關係權嵌入資源本身。這使得客戶在使用服務時能夠更輕鬆地遵循資源之間的關係。例如,這裏有一個假設person與通過兩個membership資源兩個organization資源的關係,以及那些membership資源之一:

"person890": { 
    "firstName": "Jane", 
    "lastName": "Smith", 
    "links": [{ 
     "rel": "membership", 
     "href": "memberships/123" 
    }, { 
     "link": "membership", 
     "href": "memberships/456" 
    }] 
} 

"membership123": { 
    "role": "chairwoman", 
    "date: "12/23/2013", 
    "term": "3 years", 
    "links": [{ 
     "rel": "person", 
     "href": "persons/890", 
    }, { 
     "rel": "organization", 
     "href": "organizations/7575" 
    }] 
} 

在這裏工作的基本原則是HATEOAS - 「超媒體作爲應用狀態的引擎」 - 使客戶對您的數據瞭解最少,仍然可以與您的API進行交互。

+0

我的問題並不是真正的仇恨。有一個'/ membership'具有'/ organizations/id/persons/id'和'/ persons/id/organizations/id'的優點,其中一個引用(代碼303)到另一個? – 2014-10-18 18:44:12

0

如果您的問題僅限於結構,我認爲沒有客觀的正確答案。原則上,你應該堅持保持API的一致性。如果沒有這樣的東西已經實現,我認爲這取決於你的目標是什麼。如果您想盡可能簡化API,選項1似乎足夠好。

通常,我儘量讓客戶端的API儘可能靈活,以便他們可以儘可能少地獲得所需的確切信息,並且不會打擾我實現自定義端點。假設組織可以是巨大的,有很多成員,而一個人不能成爲很多組織的成員,這是我會做的:

- 我看不出有兩級的理由URI,因此/persons/id可以是該人的規範URI,並且可以是所有組織中所有人的分頁集合的/personsorganizations/id可以是組織的URI,並且/organizations/id/persons可以爲組織中的所有人提供一個集合,併爲該人提供另一個URI。

  • 我認爲沒有必要使用303,但這是一個選擇問題。如果需要,您可能會有/organizations/id/persons/id重定向到/persons/id

  • 保持/memberships/id如您在第1

  • 描述假設你正在使用某種形式的HATEOAS的,所有的資源應該有鏈接到相關的資源。

一些其他的想法,我經常執行該幫助的易用性和靈活性:

  • 所有資源都應該有一個自己的鏈接到規範URI。

  • 您應該能夠查詢集合。與/memberships?person_id=X類似,應生成列出該人所有成員資格實例的集合子集。

  • 您應該能夠擴展資源表示以包含嵌入表示。它可能是明確的,如/persons/id?expand=memberships應該生成一個包含所有成員身份嵌入列表的字段的表示,或者您可以使用我稱之爲縮放協議的內容。你有一個參數表明應該嵌入多少級別的關係,隨着你在關係中的進展而減少。因此,/persons/id?zoom=1將嵌入成員資格,/persons/id?zoom=2將嵌入成員資格,並將zoom = 1應用於成員資格表示自身,即嵌入組織。

+0

謝謝,這是非常令人大開眼界。還有一個問題。在你的第一個項目符號中,'/ organizations/id/persons/id'是否應該被重定向到'/ membershiphips/id'?或者是否有一個特定的理由在組織間流傳時繞過成員? – 2014-10-19 06:09:02

+0

嗯......我期望'/ organizations/id/persons/id'是'/ persons/id'的別名,而不是成員身份。如果這是你的意圖,你可以有'/ organizations/id/memberships/id'。 – 2014-10-19 14:19:01