2014-03-01 50 views
1

去年我一直在做一個愛好項目。我使用Spring MVC(目前是4),並且我創建了一個試圖遵守REST原則的Web服務。組織和使用應用HATEOAS的API

我有一個名爲Athlete的資源,它與其他資源有關係,如SportEvent,'培訓師'等。

這些關係沒有嵌入到運動員資源中。相反,他們是鏈接。這是一個例子:

{ 
    "firstName": "James", 
    "lastName":"Smith", 
    "links": [{ 
     "rel": "trainer", 
     "href" : "http://somehost.com/sport/trainers/4" 
    }, 
    { 
     "rel": "sport-events", 
     "href" : "http://somehost.com/sport/athletes/4/sport-events" 
    }] 
} 

我目前在AngularJS中編寫客戶端,我打算使用這個API。在這期間,我發現了一些我沒有想到的東西。 客戶端如何實際使用這個?

讓我說我正在建立一個運動員的常規細節頁面。我也想展示運動員訓練師。我必須以某種方式擁有一個HTTP客戶端庫,它能夠解析我想要的關係,並以遞歸的方式將響應附加到「父」資源(具有關係的資源)。

它實際上是如何打算這樣的API導航?沒有明確說明你想要遵循的是什麼,你不能跟隨鏈接?因爲如果你不這樣做,你最終會創造潛在的巨大對象。你想要某種標準?

我對如何真正消費我的API非常感興趣(聽起來很奇怪,但我沒有想過通過動態解析鏈接的實際過程)。如果我能得到關於如何在JavaScript中使用它的解釋(使用庫很好),這將是一個巨大的好處。我正在使用AngularJS,所以如何在這裏應用它會更好。

+0

你應該開發你的鏈接,你應該添加輸入字段給他們,並定義他們正在使用的http方法,而不僅僅是關係......所以你的客戶端將能夠調用你的鏈接,即使它不知道任何東西關於鏈接關係。我認爲使用標準/推薦媒體類型JSON-LD,HAL + JSON等會更好...... – inf3rno

+0

@ inf3rno您可以擴展您的答案嗎?通過向它們添加輸入字段,你的意思是什麼? – Andreas

+0

以下是一個示例:https://gist.github.com/mikekelly/5619934 在我的詞彙表中,鏈接是一個抽象控制器槽,可以與您溝通REST服務。它的表示形式可以是HTML A元素,FORM元素或甚至是XHR實例... – inf3rno

回答

1

Angular-hateoas應該爲你做(大部分)工作。不過,我同意inf3rno,你應該添加類型的鏈接。所以你可能需要擴展Angular-hateoas來處理它。

1

是的,客戶端應該瀏覽鏈接並檢索所需的任何信息。沒有任何反對您提供可能只有一些所需信息的摘要資源,並且客戶端在需要更多詳細信息時檢索某個關係的鏈接。

例如,在HAL + JSON中,您擁有_embedded屬性,您可以在其中嵌入教練員的摘要,爲運動員頁面提供關於教練員所需的最少信息。

+0

我剛剛通讀了HAL的文檔,我相信這是一個好方法。我將調整我的Web服務,看看它是如何發生的。 – Andreas