[譯]HAL-超文字應用語言
精益超媒體型別
總結
HAL 是一種簡單的格式,它提供了一種一致且簡便的方法在 API 的資源之間進行超連結。
採用 HAL 將使您的 API 易於探索,並且其文件很容易從 API 本身中發現。簡而言之,這將使您的 API 更易於使用,因此對客戶端開發人員更具吸引力。
使用適用於大多數程式語言的開源庫,可以輕鬆提供和使用採用HAL的API。它也很簡單,您可以像處理其他JSON一樣處理它。
一般描述
HAL提供了一組約定以JSON或XML表示超連結。(HAL文件的其餘部分只是普通的舊JSON或XML。)
不要使用臨時結構,也不要花費寶貴的時間來設計自己的格式;您可以採用HAL的約定,並專注於構建和記錄構成API的資料和轉換。
HAL 有點像計算機的 HTML,因為它是通用的,旨在通過超連結驅動許多不同型別的應用程式。不同的是,HTML 具有幫助"人工參與者"通過 Web 應用程式實現其目標的功能,而 HAL 旨在幫助"自動參與者"通過 Web API 實現其目標。
話雖如此,HAL實際上也非常人性化。其約定使 API 的文件可以從 API 訊息本身發現。這使得開發人員能夠直接進入基於 HAL 的 API 並探索其功能,而無需將一些外部文件對映到其旅程的認知開銷。
例子
下面的示例是如何使用 hal_json 表示訂單集合。需要查詢的事項:
- 使用自連結(self)表示的主要資源的 URI("/orders")
- 指向下一頁訂單的"next"連結
- 名為"ea:find"的模板化連結,用於按 id 搜尋訂單
- 陣列中包含多個“ ea:admin”連結物件
- 訂單集合的兩個屬性; “currentlyProcessing(當前正在處理)”和“shippedToday(今天發貨)”
- 具有自己的連結和屬性的嵌入式訂單資源
- 名為"ea"的緊湊型 URI (curie) 用於擴充套件指向其文件 URL 的連結的名稱
application/hal+json
{
"_links": {
"self": { "href": "/orders" },
"curies": [{ "name": "ea", "href": "http://example.com/docs/rels/{rel}", "templated": true }],
"next": { "href": "/orders?page=2" },
"ea:find": {
"href": "/orders{?id}",
"templated": true
},
"ea:admin": [{
"href": "/admins/2",
"title": "Fred"
}, {
"href": "/admins/5",
"title": "Kate"
}]
},
"currentlyProcessing": 14,
"shippedToday": 20,
"_embedded": {
"ea:order": [{
"_links": {
"self": { "href": "/orders/123" },
"ea:basket": { "href": "/baskets/98712" },
"ea:customer": { "href": "/customers/7809" }
},
"total": 30.00,
"currency": "USD",
"status": "shipped"
}, {
"_links": {
"self": { "href": "/orders/124" },
"ea:basket": { "href": "/baskets/97213" },
"ea:customer": { "href": "/customers/12369" }
},
"total": 20.00,
"currency": "USD",
"status": "processing"
}]
}
}
HAL 型號
HAL約定圍繞著代表兩個簡單的概念:資源和連結。
資源
資源具有:
- 連結(到 URI)
- 嵌入式資源(即其中包含的其他資源)
- 狀態(沼點標準 JSON 或 XML 資料)
連結
連結有:
- 目標(URI)
- 關係,又名。"rel" (連結的名稱)
- 其他一些可選屬性,以幫助棄用、內容協商等。
下面的影像大致說明了HAL表示的結構:
HAL 在 API 中的使用方式
HAL 旨在構建 API,其中客戶端通過以下連結圍繞資源進行導航。
連結通過連結關係標識。連結關係是超媒體 API 的命脈:它們是告訴客戶端開發人員哪些可用資源以及如何與其互動的方式,它們就是它們編寫的程式碼將如何選擇要遍歷的連結。
但是,連結關係不僅僅是HAL中的標識字串。 它們實際上是URL,開發人員可以遵循這些 URL 來讀取給定連結的文件。 這就是所謂的“可發現性”。 這樣的想法是,開發人員可以輸入您的API,通讀可用連結的文件,然後通過API進行操作。
HAL鼓勵將連結關係(rel)用於:
- 識別表示中的連結和嵌入資源
- 推斷目標資源的預期結構和意義
- 向目標資源發出哪些請求和表示訊號
如何為 HAL 服務
HAL 具有 JSON 和 XML 變體的介質型別,其名稱是和分別。application/hal+json和application/hal+xml
在 HTTP 上提供 HAL 時,響應應包含相關的媒體型別名稱。Content-Type
HAL 文件的結構
最低有效檔案
HAL 文件必須至少包含空資源。
空的 JSON 物件:
{}
資源
在大多數情況下,資源應具有自己的URI
通過"self"連結表示:
{
"_links": {
"self": { "href": "/example_resource" }
}
}
連結
連結必須直接包含在資源中:
連結表示為包含在雜湊中的 JSON 物件,該雜湊必須是資源物件的直接屬性:_links
{
"_links": {
"next": { "href": "/page=2" }
}
}
連結關係
連結有關係(又名)。"rel")。這表示特定連結的語義 - 含義。
連結 rels 是區分資源連結的主要方法。
它基本上只是雜湊中的一個鍵,將連結含義("rel")與包含資料(如實際"href"值)的連結物件相關聯:_links
{
"_links": {
"next": { "href": "/page=2" }
}
}
API 可發現性
連結關係rels 應該是顯示有關給定連結的文件的 URL,使它們"可發現"。URL 通常相當長,並且有點討厭用作金鑰。為了繞過這一點,HAL 提供了"CURIEs",它們基本上是名為令牌,您可以在文件中定義,並用於以更友好、更緊湊的方式表達連結關係 URI,例如ex:widget
而不是http://example.com/rels/widget
。詳細資訊可在稍下一點的"CURIEs"部分中提供。
表示具有相同關係的多個連結
資源可能有多個共享同一連結關係的連結。
對於可能具有多個連結的連結關係,我們使用連結陣列。
{
"_links": {
"items": [{
"href": "/first_item"
},{
"href": "/second_item"
}]
}
}
注:如果您不確定連結是否應是單數,則假定該連結是多個連結。如果選擇單數並發現需要更改它,則需要建立新的連結關係或面對斷開現有客戶端。
CURIEs
"CURIEs"幫助提供指向資源文件的連結。
HAL 為您提供了一個保留的連結關係"curies",您可以使用它來提示資源文件的位置。
"_links": {
"curies": [
{
"name": "doc",
"href": "http://haltalk.herokuapp.com/docs/{rel}",
"templated": true
}
],
"doc:latest-posts": {
"href": "/posts/latest"
}
}
"curies"部分中可以有多個連結。它們帶有一個"name"和模板化的"href",其中必須包含佔位符。{rel}
然後,連結可以在其“ rel”之前加上curies的名稱。將latest-posts連結與doc文件curies關聯,將導致連結“ rel”設定為doc:latest-posts。
若要檢索有關資源的文件,客戶端將擴充套件關聯的 curies 連結與實際連結的"rel"。這將導致一個 URL,該 URL 應返回有關此資源的文件latest-posts : http://haltalk.herokuapp.com/docs/latest-posts
。
原文地址:http://stateless.co/hal_specification.html
關注筆者公眾號,推送各類原創/優質技術文章 ⬇️