簡體   English   中英

REST - 類型化資源與 HYDRA 類

[英]REST - Typed resources vs HYDRA classes

來自 Fielding 的文章( https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven ):

REST API 永遠不應該包含對客戶端很重要的“類型化”資源。 規范作者可以使用資源類型來描述接口背后的服務器實現,但這些類型必須與客戶端無關且對客戶端不可見。 唯一對客戶端重要的類型是當前表示的媒體類型和標准化關系名稱。 [同上]

在 HYDRA 中,類可以記錄在 API 文檔中,如下所示:

supportedClass:
  '@id': 'schema:Event'
    supportedProperty:
      - property:
          '@id': eventName

它不是一種類型化資源嗎? JSON-LD 中甚至還有一個@type字段。 我理解標准化關系名稱的重要性,因為它們為客戶提供了對資源或屬性進行有用操作所需的語義、格式和約束,但是通過限制 API 文檔中可能的關系范圍,我們實際上是在聲明類型(類)。

如果沒有類,客戶端將不知道將出現什么關系,並且對客戶端進行編碼以使其知道大多數關系類型(例如來自 schema.org)是不切實際的。

這個約束的確切含義是什么,它在實踐中如何有用? 九頭蛇不尊重這一點嗎?


我問這個是出於理論興趣。 實際上,如果我的 HTTP API 可用,我並不關心它是否滿足所有約束。

我想我明白了“類型化資源”(如 Fielding 所稱的)與媒體類型(如 JSON-LD/HYDRA)中定義的類型或類之間的區別。 我正在回答我自己的問題,但如有必要,請對其進行擴展/更正。


TL;DR我的理解是,這種約束將類型稱為資源的預定義表示(或結構),並提倡記錄可能的關系和媒體類型處理規則,而不是這種結構。 這些關系仍然可以在“類型”下分組,但表示不會是僵化的。


屬性通常具有預定義的名稱並在其封閉類型的上下文中被理解。 這意味着服務器/客戶端應該同意此命名約定以處理這些類型,並且在一種類型中與在不同類型中命名相同的字段可能具有完全不同的語義。 它產生了一個剛性的資源結構。

另一方面,像 JSON-LD 這樣的超媒體類型不以常見的方式使用屬性。 相反,它們使用一些嵌入信息(@context)來定義屬性的語義,可以是其他實體、值對象、引用等......

通過處理具有給定超媒體類型的資源,屬性被轉換為一些明確定義的關系,通常在詞匯表中定義。 這意味着相同的關系可以重用於多種類型,例如PersonBookname字段可以引用它們與值對象(例如簡單字符串名稱)之間的https://schema.org/name關系。

這通過允許客戶端使用關系類型的通用詞匯表以及為媒體類型定義處理規則來將客戶端與服務器分離,因此建議在直接以其序列化格式使用資源之前對其進行預處理(因為您可能不會知道它是如何返回的)。

例如:

{
  "@context": "http://schema.org/",
  "@type": "Person",
  "@id": "http://srv.org/users/1",
  "name": "Jane Doe",
  "telephone": "(425) 123-4567",
  "url": "http://www.janedoe.com"
}

是相同的資源

{
  "@context": {
    "a": "http://schema.org/name",
    "b": "http://schema.org/telephone",
    "c": {
      "@id": "http://schema.org/url",
      "@type": "@id"
    }
  },
  "@type": "http://schema.org/Person",
  "@id": "http://srv.org/users/1",
  "a": "Jane Doe",
  "b": "(425) 123-4567",
  "c": "http://www.janedoe.com"
}

甚至作為

[
  {
    "@id": "http://srv.org/users/1",
    "@type": [
      "http://schema.org/Person"
    ],
    "http://schema.org/name": [
      {
        "@value": "Jane Doe"
      }
    ],
    "http://schema.org/telephone": [
      {
        "@value": "(425) 123-4567"
      }
    ],
    "http://schema.org/url": [
      {
        "@id": "http://www.janedoe.com"
      }
    ]
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM