2012-10-26 53 views
3

我正在爲我公司的內部數據設計HATEOAS API,但一直在發現鏈接時遇到麻煩。考慮下面的一系列步驟有人可以檢索有關該系統中的特定僱員的信息:HATEOAS - 發現和URI模板

  1. 用戶發送GET來http://coredata/獲得所有可用資源,返回多個環節,包括一個標記爲相對=「http://coredata/rels/employees
  2. 用戶遵循從第一個請求的相對HREF,在執行GET(例如)http://coredata/employees

從這個最後的調用返回的數據是我的難題,並在那裏我聽說混合的建議的情況。這裏有一些:

  1. GET將返回所有僱員(可能截斷的數據),並且客戶端將負責從該列表中選擇一個它想要的。
  2. GET將返回一些URI模板鏈接,描述如何查詢/獲取一個員工/獲取所有員工。喜歡的東西:

    "_links": { 
        "http://coredata/rels/employees#RetrieveOne": { 
         "href": "http://coredata/employees/{id}" 
        }, 
        "http://coredata/rels/employees#Query": { 
         "href": "http://coredata/employees{?login,firstName,lastName}" 
        }, 
        "http://coredata/rels/employees#All": { 
         "href": "http://coredata/employees/all" 
        } 
    } 
    

我有點卡住這裏剩下最接近HATEOAS。對於選項1,I 確實不想讓我的客戶爲了導航而每次都檢索所有員工,但是我可以看到如何在示例2中使用URI模板引入一些帶外知識。

我的另一個想法是使用RetrieveOne,Query和All操作作爲我的酷URL,但這似乎違反了您應該能夠從一個基本URI導航到所需資源的概念。

有沒有其他人想出了一個很好的方法來處理這個問題?一旦您檢索到一個資源或一組資源,導航就變得非常簡單,但它似乎很難用於發現。

回答

2

選項2並不差,因爲您使用RFC 6570來表徵URI模式;而HATEOAS通常以沒有客戶端綜合URI的方式來陳述,如果服務器準備在URI模板上做出保證並以標準格式明確告訴客戶端,那麼它是可以接受的。 (我想誘使「列出所有員工」的網址沒有all後綴,以便將其與具有該ID的員工區分開來;客戶不應該 - 原則上 - 不知道員工ID是什麼樣子的。)

實際上,主要問題實際上是客戶必須瞭解這些標籤URI的含義;沒有真正的方法來猜測「http://coredata/rels/employees#All」的意思是「列出所有員工」。這就是你在客戶中嵌入知識,語義標籤等的地方,而HATEOAS並沒有真正解決這些問題。

0

我的HATEOAS API返回HTML以及HAL+JSON,正如您使用的那樣,它們都使用相同的URI,因此我的JSON響應只是返回人類Web用戶會看到的內容(減去所有漂亮的顏色)。例如

GET/


{"_links": { 
    "http://coredata/companies": { "href": "/companies?page=1" } 
    ... 
}} 



GET /companies?page=1 


{"_links": { 
    "next": { "href": "?page=2" } 
    ... 
}} 
1

TL; DR:使用OPTIONS方法以編程方式返回消耗性文檔,並始終實現分頁。

我在工作中創建了一些內部REST服務。我們已經標準化了使用OPTIONS方法來返回資源的元數據。我們返回的元數據是該資源的可解析文檔。它表示網址模板,各種選項,如PAGE,PAGESIZE和資源支持的不同方法。我們還會返回相關鏈接,因此可以使用OPTIONS進行最高級別的資源發現,而無需拖動實際數據。

我們還特別實施分頁以防止不必要地返回大量數據的問題。

+0

我喜歡這種方法的想法和各種人試圖實現的東西。例如,http://www.restdoc.org/ –