ajhsu / blog

The external storage of my brain.
3 stars 0 forks source link

oEmbed 規格 #1

Open ajhsu opened 7 years ago

ajhsu commented 7 years ago

oEmbed

oEmbed 是一種可以讓內容嵌入至第三方網站的格式。當使用者貼上一組代表資源的網址時,簡易的 API 可以讓網站顯示嵌入內容(例如照片或影片),可以無需另外轉換資源。

原文網址

完整規格

主要的規格分為三個部分:設定嵌入者的請求提供者的回應。 一個 oEmbed 的交換會發生在 嵌入者提供者 之間。

當一個 嵌入者 希望在網站上顯示一個第三方資源時,一個 提供者 必須實作 oEmbed API 來讓 嵌入者 能夠取得對應的資源。

設定

oEmbed 的設定相當簡單,提供者 必須指定一個或多個 URL scheme & API endpoint 組合。 URL scheme 描述了哪些網址是可以提供嵌入內容的,而 API endpoint 則描述了 嵌入者 可以向哪些網址請求資源。

例如:

URL scheme 可能包含一個或多個萬用字元(以星號標示)。萬用字元可以被放在網址的網域區段、或者位址當中。當被放在網域區段時,萬用字元只能被用在子網域。萬用字元不能被用在 scheme 當中(如果想同時支援 HTTP/HTTPS,請提供兩組 url/endpoint 組合)。

API endpoint 必須指向一組 HTTP/HTTPS 網址,並實作以下 API:

嵌入者請求

向 API endpoint 所發出的請求,必須是 HTTP GET 請求,並且將所有參數放進 query 參數之中。所有的參數必須被 urlencode 過(RFC 1738)。

請求參數可參考以下規格:

提供者應該忽略其他未預期的參數。但同時也歡迎提供者支援額外的客製化參數。

以下為範例:

備註:提供者也可以選擇使用 URL endpoint 來表示其資料格式,不一定要使用 query string 來表達。

例如:

在這個例子中,format 參數就可為非必要且可被忽略。當提供者制定一組 URL schene/API endpoint 時,必須明確指出 format 是該使用參數來指定,還是直接存在於既有的 URL endpoint 之中。

提供者回應

提供者所回傳的回應可以使用 JSON 或 XML 格式。這兩種格式個別有對應的方式來表達 name-value 組合。這兩種格式個別關聯到一組用來作為 Content-Type header 的回傳值的 mime-type。

JSON 回應

JSON 回應必須包含一組完整的 JSON,且必須使用 application/json 為其 mime-type。嵌入者可以透過 format=json 來請求 JSON 回應格式。

例如:

{
    "foo": "bar",
    "baz": 1
}

所需回傳的 key-value 組合在下方會提到。所有的文字必須是 UTF-8 編碼。

XML 回應

(略)

回應參數

回應可以指定其資源類型,例如 photovideo。每種類型都有對應的關聯參數。以下的回應參數在所有類型當中皆可以使用:

提供者可以自行帶入任何上述文件未提及的參數(只要遵守以上的 key-value 格式),但嵌入者也可以選擇去忽略它們。嵌入者必須忽略那些他們無法理解的參數。

video 類型
link 類型
rich 類型

錯誤

提供者應該以 HTTP 狀態代碼來回傳任何錯誤狀況,以下幾個狀態代碼在 oEmbed 規格當中被定義:

安全性顧慮

當嵌入者要顯示一組 URL 的時候,他們可能需要過濾 URL scheme,例如 http, httpsmailto;即使提供者無須考慮這些擔憂,自由地指定任何有效的網址(javascript:...),但仍可能導致 XSS 攻擊。

可探索性

oEmbed 提供者可以藉由以下 header 來選擇是否開放探索:

<link rel="alternate" type="application/json+oembed"
  href="http://flickr.com/services/oembed?url=http%3A%2F%2Fflickr.com%2Fphotos%2Fbees%2F2362225867%2F&format=json"
  title="Bacon Lollys oEmbed Profile" />
<link rel="alternate" type="text/xml+oembed"
  href="http://flickr.com/services/oembed?url=http%3A%2F%2Fflickr.com%2Fphotos%2Fbees%2F2362225867%2F&format=xml"
  title="Bacon Lollys oEmbed Profile" />

包含在 href 屬性當中的網址,必須包含完整的 oEmbed endpoint 加上 URL 以及任何有效的格式。任何其他的參數則是不必要的。

type 屬性則必須為 application/json+oembed (JSON) 或 text/xml+oembed (XML)。