JSON Hyper-Schema Draft-06 版本說明

從 draft-luff-json-hyper-schema-00 (draft-04) 遷移到 draft-wright-json-schema-hyperschema-01 (draft-06) 的版本說明。

注意: draft-07 已發佈

draft-07 的遷移說明更直接概述了如何從 draft-04 遷移到 draft-07,跳過了 draft-05 和 draft-06 複雜的中間狀態。保留此頁面是為了歷史興趣,但不建議那些只想使用最新草案的人參考。

對於實作者: 我們建議直接實作 draft-07,而不是 draft-06 或更早的版本。

問:draft-04 和 draft-06 之間的不相容變更有哪些?

在 draft-04 和 draft-06 之間,我們對 Hyper-Schema 進行了重大重新檢視,而 Hyper-Schema 從未像 JSON Schema 驗證那樣被廣泛採用。

雖然我們知道 draft-06 仍然存在重大缺陷,但我們認為這是一組很好的變更,可以收集回饋。隨著 draft-07 的發布,應使用該草案或更新的版本,而 draft-06 則成為歷史上的奇聞。

從 draft-04 到 draft-05 的變更

關鍵字變更後果
"base"取代了查找最近的 "self" 鏈接以確定 "href" 的基本 URI如果您依賴 "self" 鏈接來更改基本 URI,請明確設定 "base"
"rel""full" 關係已移除使用 "item"
"rel""instances" 和 "create" 關係已移除使用 "collection"
"rel""root" 關係已移除在您的 "href" URI 範本中使用片段
"fragmentResolution"已移除媒體類型決定如何解釋片段
"pathStart"已移除[無替代方案]
"method"改回 "get" 和 "post" 的 HTML 表單語義,而不是所有 HTTP 方法[由於回饋意見表示這令人困惑,因此在 draft-06 中再次更改]

從 draft-05 到 draft-06 的變更

關鍵字變更後果
"method"已移除有關 HTTP 方法的建議,請參閱問題 #73#296(如果需要,請使用 "method""allow" 作為擴充關鍵字);不再需要指示如何使用 "schema""encType"
"schema"已移除使用 "hrefSchema""submissionSchema""targetSchema"
"encType"已移除請求主體使用 "submissionEncType";URI 查詢字串不再需要。
"hrefSchema"已新增取代 "method": "get", "schema": {...},並具有額外功能
"submissionSchema"已新增取代 "method": "post", "schema": {...}
"submissionEncType"已新增取代 "method": "post", "encType": "..."
"href"已移除預處理將在未來的草案中取代並擴充

"targetSchema" 的正確使用方式

雖然 "targetSchema" 在最近的兩個草案中意義並未改變,但它被廣泛誤解。因此,依照規範使用可能會感覺像是一種改變。

由於 draft-04 強調將個別的 HTTP 方法作為 "method" 的值,許多使用者將 "targetSchema" 解釋為 "method" 中方法的響應提示。這從來都不是正確的;所有的草案都將此關鍵字定義為描述目標資源的呈現方式,該呈現方式會作為 HTTP GET 的響應出現,但也可能不會在其他響應中出現。

Draft-06 闡明了這種用法,並提供了在不同 HTTP 方法中使用的指南。這包括將 "targetSchema" 作為 PUT 和 PATCH 的請求描述。在 draft-04 中,許多使用者使用 "schema" 來描述 PUT 和 PATCH 請求,這是沒有必要的。

然而,"targetHints" 提案已被接受納入 draft-07 中。其中,它允許提示 "Accept-Patch",這對於在 HTTP PATCH 中正確使用 "targetSchema" 是必要的。在 draft-07 中將會有範例和詳細的指南。

問:為什麼在 draft-06 發佈之前,對 Hyper-Schema 進行了幾項重大變更?

答:在最終審查期間,很明顯對於如何使用現有的規格沒有共識。為了發布一個具有明確含義的規格,以便我們可以獲得有關其內容的回饋,而不是不同的解釋,這些後期的變更是有必要的。最初,我們試圖單純地釐清已有的內容,但後來我們意識到,首先對於已有的內容就沒有達成共識。

問:為什麼這個規格不再提及或表現得像 HTML?

答:我們達成共識,現有的類比弊大於利,原因有二

  1. 在 draft-03 和 draft-04 之間的變更中,讓 "method" 指示任何 HTTP 方法,而不是 HTML 的 <form method="..."> "get" 和 "post" 值,打破了與 HTML 的原始類比,並且試圖改回此類比並未受到歡迎
  2. 只能夠為 URI 查詢字串(但不是 URI 的其他部分)或請求主體使用 "schema""encType",但無法同時處理兩者,對於 API 設計來說過於限制

分割 "schema"

我們沒有讓 "schema" 根據 "method" 執行兩個不同的操作,而是將其分割為兩個關鍵字,每個操作一個關鍵字。這樣可以在需要時同時使用兩者,這是在 HTML 表單中不存在的使用案例。

"hrefSchema" 取代了 "method": "get" 的用法,但利用 URI 範本變數,使得客戶端數據驅動的動態 URI 不再侷限於查詢字串。"encType" 在這種方法中不再需要。

"submissionSchema" 直接取代了 "method": "post" 的用法,而 "submissionEncType" 取代了 "encType"

移除 "method"

Draft-05 嘗試恢復 draft-03 的 "method" 行為,但回饋告訴我們,使用者覺得這個變更非常令人困惑。在 "schema" 分割後,draft-05 的 "method" 行為不再需要。

我們可以切換回 draft-04 的 "method" 行為,但除了來回切換會產生更多混淆之外,draft-04 對於 "method" 的處理方式無論如何都與 LDO 設計的其他部分不一致。最值得注意的是,它導致了上述 "targetSchema" 的使用問題。

答:理想情況下,這應由您的連結關係類型隱含傳達,這是機器導向超媒體中整體語義的主要指標。RFC 5988 提供了建立自訂(又稱「擴充」)連結關係的指南。

幾個 URI 方案和命名空間,例如 urn: 方案中的 UUID 命名空間,或者 tag: 方案,特別適用於建立唯一識別符。

當然,也有一些方法可以在執行時偵測到這一點,例如 HTTP 的 "Allow" 回應標頭,或者嘗試一種方法並相應地處理 405 Method Not Allowed 錯誤。

答:"targetHints" 提案是 draft-07 的一部分,因此將其作為 draft-06 的擴充是一個選項,但我們建議此時直接使用 draft-07。

問:如果 "targetSchema" 不是回應,那麼我該如何描述回應?

答:您應該為您的各種成功和錯誤回應提供超模式,但將它們連結到連結更多是文件問題,而不是使用問題:每個回應都會指出自己的模式,因此您不需要在執行時提前知道它。

從來沒有 Hyper-Schema 關鍵字來明確地將回應與 HTTP 方法等操作關聯起來。這樣的使用案例似乎是關於產生 API 文件,因此這很可能是 JSON Schema API 文件詞彙的候選者。

需要協助嗎?

您覺得這些文件有幫助嗎?

幫助我們改進文件!

在 JSON Schema 中,我們重視文件貢獻,就像其他任何類型的貢獻一樣!

仍然需要協助嗎?

學習 JSON Schema 通常令人困惑,但別擔心,我們在這裡提供協助!