公開以降に報告されたエラーや問題については、正誤表をご確認ください。
この仕様の英語版が唯一の規範的なバージョンです。非規範的な翻訳 も利用できる場合があります。
Copyright © 2017 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
Micropubプロトコルは、サードパーティクライアントを使用して自分のドメイン上の投稿を作成、更新、削除するために使われます。Webアプリやネイティブアプリ(例:iPhone、Android)は、Micropubを利用して自分のウェブサイトに記事、短いメモ、コメント、いいね、写真、イベント、その他の種類の投稿を公開・編集できます。
このセクションは、発行時点の文書のステータスについて説明しています。今後、ほかの文書が本書に取って代わる場合があります。現在のW3C公開文書や、この技術文書の最新改訂版の一覧は、W3C技術文書インデックス(https://www.w3.org/TR/)でご確認いただけます。
この文書はSocial Web作業グループによって勧告として発行されました。本書に関するご意見を歓迎します。ご意見は public-socialweb@w3.org(購読、 アーカイブ)までお送りください。
作業グループの実装報告もご参照ください。
本文書はW3Cの会員、ソフトウェア開発者、その他のW3Cグループおよび関係者によってレビューされ、ディレクターによるW3C勧告として承認されています。本書は安定した文書であり、参考資料や他の文書から引用する際にご利用いただけます。W3Cの勧告策定における役割は、この仕様書への注目を喚起し、広範な普及を促進することです。これによりWebの機能性と相互運用性が向上します。
本文書は 2004年2月5日 W3C パテントポリシーの下で運営されているグループによって作成されました。 W3Cは、グループの成果物に関連して提出されたパテント公開の一覧を公開しており、そのページにはパテント公開の方法についても記載されています。個人が、 本質的請求項を含むと考えるパテントについて実際の知識を有する場合には、 W3Cパテントポリシーの第6節に従って情報を公開する必要があります。
本書は2017年3月1日 W3Cプロセス文書に準拠しています。
このセクションは規範的ではありません。
Micropubはウェブやネイティブアプリクライアントを用いてサーバー上で投稿の作成・更新・削除を行うための仕様です。Micropubは主にウェブサイト上で「投稿」(ブログ記事、写真、短いノート、コメントなどの個々のコンテンツ)を作成することに重点を置いていますが、他の種類のコンテンツにも利用できます。Micropub仕様は、コンテンツの作成方法をシンプルに定義し、また更新および削除のためのより包括的なメカニズムも定めています。
Micropub仕様は、AtomPubやMetaWeblog APIを簡略化したバージョンとして始まりました。AtomPubがAtomフィード内のアイテムを作成するAPIであるのに対し、Micropubは[Microformats2]フィード内のアイテムを作成するAPIです。
Micropubは、AtomPubやMetaWeblogとは異なる語彙を使用するだけでなく、両APIをいくつかの点で簡素化および改善しています。Micropubは認証に旧来の安全でないユーザー名・パスワード方式に代えてOAuth 2.0ベアラートークンを利用します。また、XMLRPC方式よりも簡単で安全な、従来のフォーム投稿やJSON投稿にも対応しています。
Micropubの語彙は[Microformats2]語彙から直接派生しています。Micropubは、HTTP POSTとして送信可能なMicroformatsのシリアライズを意図しており、新しいMicropub語彙を作成するときは、Microformatsの表現を調べて逆方向で設計を進める方法がとられます。
本書におけるキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「 SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、「OPTIONAL」は、[RFC2119] に記載されているとおりに解釈されます。
本セクションではMicropubクライアントおよびサーバーの適合基準について説明します。全ての実装はUTF-8エンコーディングをMUSTサポートしなければなりません。
投稿を作成する適合Micropubクライアント:
x-www-form-urlencodedリクエストの送信をサポートすること
投稿を編集する適合Micropubクライアント:
適合Micropubサーバー:
x-www-form-urlencoded構文での投稿作成をサポートすること
multipart/form-dataリクエストをMUSTサポートする本仕様は各機能について少なくとも2つの独立した相互運用可能な実装が存在することでCRを終了します。各機能は別の製品で実装されていても構いません。すべての機能が1つの製品で実装されている必要はありません。この基準のため、ここで用語を定義します:
Micropubクライアントは、Micropubリクエストを送信して投稿を作成・操作する実装です。適合基準は上記適合クラスに記載されています。
Micropubサーバーは、Micropubリクエストに従い投稿の作成、必要に応じて編集・削除ができる実装です。Micropubサーバーはファイルの送信を主Micropubエンドポイントの外で扱うためのMedia EndpointもMAYサポートできます。適合基準は上記適合クラスに記載されています。
各実装はそれぞれ別の当事者によって開発され、他の適格な実装のコードを共有・再利用・派生させてはなりません。本仕様の実装に関わらないコードの断片はこの要件の対象外です。
クライアントとサーバーの実装が特定の機能で相互運用可能と見なされるのは、サーバーがクライアントの要求に応じて定められた動作を行い、クライアントがその機能に従って期待される応答を受け取り、サーバーがクライアントに期待通りの応答を返した場合です。
実装とは、次のすべての条件を満たすMicropubクライアントまたはサーバーを指します:
終了基準の評価において、次の各項目は機能と見なされます:
Authorizationヘッダーにアクセストークンを含めて認証するx-www-form-urlencodedリクエスト本文にアクセストークンを含めて認証するx-www-form-urlencoded構文で投稿を作成するx-www-form-urlencoded構文で投稿作成に使用するmultipart/form-dataでMicropubエンドポイントへリクエストし、ファイル付き投稿を作成するHTTP 201 CreatedとLocationヘッダーを返すHTTP 202 CreatedとLocationヘッダーを返すHTTP 200 OKを返すHTTP 201 Createdを返すHTTP 204 No Contentを返すx-www-form-urlencoded構文で投稿を削除するx-www-form-urlencoded構文で投稿を復元(undelete)するq=configクエリでMedia Endpointやシンジケーションターゲット情報を取得するq=syndicate-toクエリでシンジケーションターゲットのリストを取得する実装報告はhttps://micropub.net/implementation-reports/で提出してください。提出方法はそのURLで案内されています。実装報告用テンプレートは、micropub.rocksで利用可能なテストを参照しています。
micropub.rocksは実装をライブテストするために使用できる多数のテストケースを提供します。また、Micropub実装の開発時に活用でき、エラー時には詳細な応答も示されます。
[microformats2-parsing]がHTMLドキュメントをデータ構造に変換するための比較的小規模なパースルールセットを持つように、Micropubも同様に、HTTP POSTおよびGETリクエストをMicropubコマンドとして解釈するための少数のルールを定義しています。[microformats2-parsing]が[h-entry]などのオブジェクトの新しいプロパティを導入する際にパースルールの変更を必要としない場合、Micropubも同様に、リクエストの解釈のためにパースルールの変更を必要としません。例えば動画の投稿と「いいね」の投稿のように異なる投稿タイプに対応する場合もです。
Micropub構文は、HTTP POSTおよびGETリクエストを有用なサーバーアクションに解釈する方法を記述しています。
すべてのMicropubの投稿作成リクエストは、UTF-8でエンコードしたx-www-form-urlencoded、
multipart/form-data
[HTML5]、または[JSON]エンコードHTTPリクエストとして送信されます。レスポンスには通常レスポンスボディを含まず、作成された投稿のURLなどの必要な情報はHTTPヘッダーで示されます。レスポンスボディが必要な場合は、[JSON]形式のオブジェクトとして返すSHOULDがあります。
x-www-form-urlencodedおよびmultipart/form-dataリクエストでは、Micropubは標準URLエンコーディングの拡張として複数値のプロパティを明示的に指定できる仕組みをサポートしています。具体的には、あるプロパティに複数の値を送信するには、プロパティ名の後ろに角括弧[]を付けるMUSTがあります。
例えば、"category"プロパティに複数の値を指定する場合、リクエストにcategory[]=foo&category[]=barのように含めます。
サーバー側では、これを内部的に配列として扱うことが期待されています。例えば、その等価なJSON表現は以下のようになります。
{
"category": [
"foo",
"bar"
]
}
この方法はマルチパートリクエストでも同様であり、それぞれの値をリクエストの個別の「パート」として与え、名前にContent-Disposition: form-data; name="category[]"のように指定します。
x-www-form-urlencoded
構文に対する拡張は、配列を示す角括弧を追加することだけです。foo[0]やfoo[bar]のような構文はサポートされていません。より複雑なオブジェクトを投稿する場合は、JSON構文 の利用が推奨されます。
x-www-form-urlencodedやmultipart/form-dataでリクエストを送信する場合、一部のPOSTボディプロパティ名は予約されています。
access_token - リクエストの認証に用いられるOAuthベアラートークン(アクセストークンはHTTP
Authorizationヘッダーまたはこのフォームパラメータとして送信可能)h - 作成するオブジェクトタイプを指定するために使うaction -
deleteまたはundelete(フォームエンコード構文では更新はサポートされません)を示す
url - 対象となるオブジェクトのURLを示すmp-* - 将来的な利用のために予約
x-www-form-urlencodedまたはmultipart/form-dataリクエストで投稿を作成する際、それ以外のプロパティはすべて作成されるオブジェクトのプロパティとみなされます。
サーバーはMUST
NOTaccess_tokenプロパティを投稿に保存してはいけません。
mp-で始まるプロパティは、クライアントがサーバーにコマンドを送る仕組みのために予約されています。通常、投稿のプロパティはユーザーに表示されますが、サーバーへのコマンドはユーザーには表示されず、投稿のプロパティとして意味がありません。新しいmp-コマンドの実験を行いたいクライアントやサーバーは、indieweb.org/Micropub-extensionsでアイディアを出し合い、実装を文書化することを推奨します。
JSON構文で投稿を作成する場合も、mp-で始まるプロパティは上記の通り予約されています。
投稿を作成するには、作成する投稿タイプとそのプロパティを指定してMicropubエンドポイントにHTTP
POSTリクエストを送信します。タイプが指定されていない場合は、デフォルトタイプ[h-entry]をSHOULD使うべきです。クライアントとサーバーは、x-www-form-urlencoded構文による投稿作成をMUSTサポートし、JSON構文による投稿作成もMAYサポートできます。
h={Microformats object type}
例:h=entry
"mp-"で始まらないすべてのパラメータは作成対象オブジェクトのプロパティです。
例:content=hello+world
h-entryなどでプロパティに複数の値(例:複数カテゴリ)を指定するには、プロパティ名の末尾に角括弧を付けて配列であることを示します。
例:category[]=foo&category[]=bar
複数値をとるプロパティは、角括弧の有無に関わらず、単一値もMUST受け付けなければなりません。以下にフォームエンコードリクエストの完全な例を示します。
h=entry&content=hello+world&category[]=foo&category[]=bar
ファイルをアップロードする場合は、クライアントはMedia Endpointの存在をMUST確認してください。Media
Endpointが無い場合、Micropubエンドポイントでファイルが直接受け付けられるとみなしそのままリクエストを送れます。ファイルをMicropubエンドポイントにアップロードするには、リクエスト全体をmultipart/form-data形式で作成し、ファイルは標準プロパティとして送信します。
例として、キャプション付き写真をアップロードする場合、h、content、photoの3つのパートを含めます。
multipart/form-data; boundary=553d9cee2030456a81931fb708ece92c
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="h"
entry
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="content"
Hello World!
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="photo"; filename="aaronpk.png"
Content-Type: image/png
Content-Transfer-Encoding: binary
... (binary data) ...
--553d9cee2030456a81931fb708ece92c--
photoやvideoなどファイルアップロードを受け付けるプロパティは、ファイルのURL値も同等として受け付けるMUSTがあります。エンドポイントはURL先のファイルを[Fetch]でダウンロードし、アップロードと同じように保存してもMAYです。例:
h=entry&content=hello+world&photo=https%3A%2F%2Fphotos.example.com%2F592829482876343254.jpg
これはMedia Endpoint経由でファイルをアップロードする場合や、外部画像を参照する場合などのためのものです。詳細はMedia Endpointセクションを参照してください。
プロパティのより複雑な値を扱うために、解析済みMicroformats 2 JSONフォーマットでエントリを送信することで、JSON構文で投稿を作成できます。
この場合、ファイルを同時にアップロードすることはできず、前述のようにURLでファイルを参照することだけが可能です。
JSON形式で投稿を作成する場合、すべての値は一つだけでも配列形式で指定しなければならず、Microformats 2
JSONフォーマットと同様です。このリクエストはapplication/jsonコンテンツタイプで送信します。
mp-で始まるプロパティは、予約プロパティの説明の通り予約されています。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"content": ["hello world"],
"category": ["foo","bar"],
"photo": ["https://photos.example.com/592829482876343254.jpg"]
}
}
アップロードする画像にaltテキストを付加するには、Microformats
2構文を用いてphotoプロパティの画像URLおよびaltテキストを指定できます。値にURLのみでなく、valueにURL、altにテキストを持つオブジェクトを使います。photoの値がオブジェクトとなるため、フォームエンコードやマルチパートリクエストは利用できません。まず写真をMedia
Endpointへアップロードし、そのURLをJSONリクエストに記載する必要があります。下の例を参照してください。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"content": ["hello world"],
"category": ["foo","bar"],
"photo": [
{
"value": "https://photos.example.com/globe.gif",
"alt": "Spinning globe animation"
}
]
}
}
altテキスト指定方法は、画像altテキストの表現方法に関するMicroformats 2提案(issue 2)が組み込まれることを想定して追加されました。これが別の方法で解決された場合はMicropub仕様もそれに合わせて調整されるべきです。
可能な限り、ネストしたMicroformatsオブジェクトは避けるべきです。より良いアプローチは、オブジェクトをURLで参照することです。典型的な例は、施設のh-card(場所へのチェックインや人物・場所をタグ付けする場合など)の含有です。この場合、必要に応じて先にオブジェクトを作成してURL参照するのが望ましいです。
この方法によれば、作成された各オブジェクトに固有のURL(データごとにリンク)が与えられるメリットがあります。また、サーバーは各エンティティを個別に処理でき、既存施設の重複生成を防いだり、既存の施設に新たなデータを統合して返すことができます。
場合によってはネストオブジェクト自体にURLを持たせる意味がないこともあります。例として、h-measure値を投稿する際はh-measure自体にURLを持たせる理由がないため、この場合はネストしたMicroformatsオブジェクト構文の利用が適切です。
ネストしたオブジェクトは、formエンコード構文では一貫してサポートできないため、JSON形式でリクエストを送る必要があります。
以下の例は、h-measureオブジェクトを使いweightやbodyfat値を示す新しい「体重」投稿をh-entryで作成する例です。
{
"type": ["h-entry"],
"properties": {
"summary": [
"Weighed 70.64 kg"
],
"weight": [
{
"type": ["h-measure"],
"properties": {
"num": ["70.64"],
"unit": ["kg"]
}
}
],
"bodyfat": [
{
"type": ["h-measure"],
"properties": {
"num": ["19.83"],
"unit": ["%"]
}
}
]
}
}
Micropubリクエストの自然言語値はMAY双方向テキストを含むことができます。Micropubテキスト値のデフォルトの基底方向は左から右です。個々の自然言語値の基底方向は、下記の方法で明示的に変更MAYできます。
自然言語値で双方向テキストを指定し、かつその基底方向がそのテキストの最初の強い方向性文字で正しく特定できない場合([BIDI])、公開クライアントはその値の前にUnicode双方向制御文字を付加するか、HTML値の場合はHTML方向属性を使って明示的に基底方向を特定するSHOULDです。
双方向テキストを含む自然言語値を受け入れるMicropubサーバーは、プレーンテキスト値の場合は最初の強い方向性文字のスキャン、HTML値の場合は方向属性やタグ外の最初の強い方向性文字のスキャンを用いて、任意の自然言語値の基底方向を特定するSHOULDです。これらの自然言語値を表示する際、サーバーは[BIDI]アルゴリズムに従い、適切なコンテンツレンダリングをMUST判定し、必要に応じて文字列の周囲に制御文字やマークアップを追加して基底方向を示す必要があります。
リクエストにサーバーが認識しないプロパティが含まれている場合、サーバーは未認識のプロパティを無視しなければならず、認識した値で投稿を作成します。
これにより、クライアントはサポートするサーバーにはリッチなコンテンツを投稿し、サポートしないサーバーにもフォールバックコンテンツを投稿することができます。
たとえば、クライアントがweightプロパティにh-measure値を持つ体重測定投稿と、summaryプロパティにプレーンテキストの要約を含んだ投稿を作成した場合、サーバーがweightプロパティを認識しない場合はこれを単に無視し、summaryのみを持つプレーンテキスト投稿として作成します。
投稿が作成された場合、MicropubエンドポイントはHTTP 201
CreatedステータスコードまたはHTTP 202
Acceptedコードを返し、作成された投稿のURLを示すLocationヘッダーを必ず返さなければなりません。[RFC2616]
HTTP/1.1 201 Created
Location: https://aaronpk.example/post/1000
エンドポイントがリクエストを即時処理せず非同期で処理・保存することを選択した場合、HTTP 202
Acceptedステータスコードと、同様にLocationヘッダーを返す必要があります。サーバーはHTTP
202返却前に、オブジェクトが確実に作成されることを担保するためにエラーチェックおよびバリデーション処理を同期的に行う必要があります。クライアントはHTTP 202レスポンスを受け取った場合、指定URLに将来(近いうちに)対象オブジェクトが存在することを期待します。
ターゲットがショートリンクや他の場所へのシンジケーション投稿も提供する場合は、MicropubエンドポイントはHTTP Linkヘッダーで適切な"rel"値を付与し追加URLを返してもかまいません。たとえば、投稿のショートURLを返す場合:
Link: <http://aaron.pk/xxxxx>; rel="shortlink"
または、シンジケーション投稿のURLを含める場合:
Link: <https://myfavoritesocialnetwork.example/aaronpk/xxxxxx>; rel="syndication"
エラー発生時の指示方法は、下記「エラー応答」セクションを参照してください。
Micropubサーバーは、ここで説明するような個々のプロパティの追加や削除を含む投稿の更新操作をサポートすることが推奨されます。
エントリの更新は、変更内容を記述したJSON投稿によって実現します。
エントリを更新するには、"action": "update"を送り、更新対象エントリのURLを"url"プロパティで指定します。リクエストには更新内容を示すreplaceや
add、deleteプロパティ(またはこれらの任意の組み合わせ)を必ず含めてください。
replaceやadd、deleteキーの各プロパティ値は、値が1つだけでも常に配列形式で指定しなければなりません。
同一リクエスト内でadd/delete操作を組み合わせることは可能ですが、それぞれ別のプロパティ-値の組合せを対象とする場合のみに意味があります。同じプロパティ-値組合せに対する複数操作は、サーバーによっては未定義の動作となる可能性があります。
プロパティのすべての値を置換します。プロパティが存在しない場合は作成されます。
{
"action": "update",
"url": "https://aaronpk.example/post/100",
"replace": {
"content": ["hello moon"]
}
}
この操作はエントリ全体のcontentを新しいテキストで置き換えます。他のプロパティはそのまま残ります。
このプロパティに既存の値があれば、それらは変更せず、新しい値が追加されます。プロパティが存在しない場合は作成されます。
ユースケース:投稿後にシンジケーションリンクを追加する場合。たとえば、クライアントがまず投稿し、その後でMyFavoriteSocialNetworkやWikimediaにシンジケートする場合、サイトは新しいシンジケーションURLで元の投稿を更新する手段が必要です。
シンジケーションURLを追加するには、更新リクエスト内に1つ以上のURLを含めます。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"add": {
"syndication": ["http://web.archive.org/web/20040104110725/https://aaronpk.example/2014/06/01/9/indieweb"]
}
}
ユースケース:投稿作成後にタグを追加する場合。
カテゴリ等のプロパティに複数値を追加するには、新しい値を配列で指定します。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"add": {
"category": ["micropub","indieweb"]
}
}
プロパティが存在する場合、それを削除します。指定したプロパティ全体を完全に削除します。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"delete": ["category"]
}
カテゴリなど複数値のプロパティについては、値単位で個別に削除可能です。残る値がなければプロパティそのものが削除されます。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"delete": {
"category": ["indieweb"]
}
}
サーバーは、更新リクエストが成功した場合、HTTP 200、201 または 204で応答しなければなりません。更新操作により投稿のURLが変更された場合、サーバーはHTTP 201で応答し、新しいURLをHTTP
Locationヘッダーで必ず含める必要があります。それ以外の場合は、レスポンスボディ有無に応じて200または204を返します。レスポンスにボディは不要ですが、行った変更内容を記載するJSONオブジェクトが含まれてもかまいません。
Micropubサーバーは、投稿の削除をサポートすべきであり、未削除(undelete)投稿のサポートもしてもよいです。
あるURLのエントリー全体を削除するには、action=deleteと削除対象アイテムのURLをurlプロパティに含めてPOSTリクエストを送信します。
action=delete
&url=https://aaronpk.example/2014/06/01/9/indieweb
{
"action": "delete",
"url": "https://aaronpk.example/2014/06/01/9/indieweb"
}
投稿を未削除(undelete)するには、"undelete" をアクションとして使用します。
action=undelete
&url=https://aaronpk.example/2014/06/01/9/indieweb
{
"action": "undelete",
"url": "https://aaronpk.example/2014/06/01/9/indieweb"
}
サーバーは、削除や未削除リクエストが成功した場合、HTTP 200, 201 または 204 で応答しなければなりません。未削除操作により投稿のURLが変更された場合、サーバーはHTTP
201で応答し、新しいURLをHTTPLocationヘッダーに含める必要があります。そうでなければ、レスポンス本文に内容があるかどうかに応じて、サーバーは200または204で応答します。レスポンスで本文は不要ですが、変更内容を記述したJSONオブジェクトを含めても構いません。
Micropubアプリケーションのより良いユーザー体験の提供と、JSON構文ではファイルアップロードできないという制限を克服するために、Micropubサーバーは「メディアエンドポイント」をサポートしてもよいです。メディアエンドポイントの役割は、ファイルのアップロード専用で、アップロード結果として後続のMicropubリクエストで利用できるURLを返します。
Micropubサーバーがメディアエンドポイントをサポートしている場合、クライアントは、ユーザーが投稿の他の部分を作成している間にも、すぐに写真や他のメディアのアップロードを開始できます。下記の図は、写真のアップロード中に同時に投稿を作成できるユーザーインターフェースの例です。
このユーザーフローは、デスクトップアプリと同様にモバイルアプリにも適用できます。一般的に、より多くの処理を非同期で行うことで、ユーザーがシステム完了を待つことなく作業継続でき、アプリの使い勝手が向上します。
Micropubエンドポイントがメディアエンドポイントをサポートしていることを通知するには、サーバーはMicropub設定リクエストでmedia-endpointというキーにメディアエンドポイントのフルURL値を含める必要があります。クライアントはメディアエンドポイントがMicropubエンドポイントと同一ドメイン上にあると想定してはいけません。
GET /micropub?q=config
Authorization: Bearer xxxxxxxxx
{
"media-endpoint": "https://media.example.com/micropub"
}
メディアエンドポイントは、Micropubエンドポイントが受け入れるのと同じアクセストークンを受け入れなければなりません。
ファイルをメディアエンドポイントにアップロードするには、クライアントはfileという名前の1つのパートを含めてmultipart/form-dataリクエストを送信します。メディアエンドポイントはクライアントが送信するファイル名を無視しても構いません。
multipart/form-data; boundary=553d9cee2030456a81931fb708ece92c
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="file"; filename="sunset.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
... (binary data) ...
--553d9cee2030456a81931fb708ece92c--
画像のalt属性などアクセシビリティに関連した情報を含めたい場合、画像を含む投稿作成時にaltテキストを投稿自体に紐づけます。これはHTMLのimgタグがsrc属性でファイル参照し、alt属性で説明を加えるのと同じです。詳細はaltテキスト付き写真アップロードを参照してください。
メディアエンドポイントは、ファイルアップロードを処理し、好きなバックエンドに保存してファイルへのURLを生成します。そのURLは推測されづらい値(UUIDなど)であるべきです。リクエストが成功した場合、エンドポイントは作成ファイルのURLをHTTPLocationヘッダーに含めてHTTP 201 Createdで返します。レスポンスボディの内容は特に定められていません。
HTTP/1.1 201 Created
Location: https://media.example.com/file/ff176c461dd111e6b6ba3e1d05defe78.jpg
Micropubクライアントは、このURLをMicropubリクエストの"photo"プロパティなどの値として利用できます。
メディアエンドポイントは、Micropubリクエストで特定時間以内に利用されなかったファイルを定期的に削除しても構いません。
メディアエンドポイントは、Micropubエンドポイントと同様のエラーレスポンスの慣例に従うべきです(詳細はエラーレスポンス参照)。
Micropubクライアントは、エンドポイントの機能を発見したり(たとえばユーザー表示用のシンジケーションターゲットリストの取得や、投稿情報の取得など)、Micropubエンドポイントへクエリを投げる必要がある場合があります。
クエリする場合は、MicropubエンドポイントにGETリクエストし、qパラメータで取得したい内容を指定します。
MicropubエンドポイントURLにクエリパラメータ(例:?micropub=endpoint)が既に含まれる場合、クライアントは既存クエリを置き換えず追記する形でqパラメータを付与しなければなりません。
ユーザーがMicropubクライアントに初回ログインした際、クライアントはエンドポイントに関する初期情報を問い合わせる必要があります。クライアントはq=configでクエリ要求し初期設定情報を取得すべきです。
サーバーは設定レスポンスで下記情報を含めるべきです。
syndicate-to。レスポンス構造はシンジケーションターゲット参照)media-endpoint)GET /micropub?q=config
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"media-endpoint": "https://media.example.com/micropub",
"syndicate-to": [
{
"uid": "https://myfavoritesocialnetwork.example/aaronpk",
"name": "aaronpk on myfavoritesocialnetwork",
"service": {
"name": "My Favorite Social Network",
"url": "https://myfavoritesocialnetwork.example/",
"photo": "https://myfavoritesocialnetwork.example/img/icon.png"
},
"user": {
"name": "aaronpk",
"url": "https://myfavoritesocialnetwork.example/aaronpk",
"photo": "https://myfavoritesocialnetwork.example/aaronpk/photo.jpg"
}
}
]
}
サーバーは設定クエリをサポートし、そのサーバーに関連する全てのプロパティを返すべきです。該当するプロパティがなければ、レスポンスは空のJSONオブジェクト{}であるべきです。
クライアントは想定外のレスポンスも空レスポンスとみなして処理し、サポートしていないサーバーからの予期しない応答にも対応すべきです。たとえば設定クエリ非対応サーバーはHTTP 400レスポンスを返す場合もありますが、それも空JSONオブジェクトと同等に扱うべきです。
Micropubクライアントは、エンドポイントに特定の投稿プロパティのクエリを送信できます。これにより、例えばタグ追加用インターフェース等、必要なプロパティのみをリクエストし取得できます。
投稿の更新に対応しているサーバーは、ソースコンテンツクエリをサポートしなければなりません。
クエリには、MicropubエンドポイントへGETリクエストを送り、qパラメータにsourceを指定し、urlパラメータで投稿のURLを指定します。リクエストするプロパティ名は、propertiesキーで一つ以上指定でき、複数なら[HTML5]のURLエンコーディング規則どおり配列ブラケット記法で指定します。
エンドポイントは、[microformats2-parsing] [JSON]形式で、propertiesオブジェクトにクエリ対象プロパティ名をキーとして返します。何も指定しない場合、すべてのプロパティと、投稿種類のtypeプロパティを含めて返す必要があります。
GET /micropub?q=source&properties[]=published&properties[]=category&url=https://aaronpk.example/post/1000
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"properties": {
"published": ["2016-02-21T12:50:53-08:00"],
"category": [
"foo",
"bar"
]
}
}
GET /micropub?q=source&url=https://aaronpk.example/post/1000
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"published": ["2016-02-21T12:50:53-08:00"],
"content": ["Hello World"],
"category": [
"foo",
"bar"
]
}
}
投稿ソースがHTMLだった場合、エンドポイントはcontentプロパティをhtmlプロパティを持つオブジェクトで返さなければなりません。それ以外の場合、contentプロパティは文字列値で返し、クライアント側ではプレーンテキストとみなします。この挙動は[microformats2-parsing]の値仕様に準拠します。
以下はHTMLで記述された投稿内容を取得する例です。
GET /micropub?q=source&properties=content&url=https://aaronpk.example/post/1000
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"properties": {
"content": [
{
"html": "<b>Hello</b> <i>World</i>"
}
]
}
}
クライアントやサーバーでクエリアクションの拡張を検討・実装したい場合は、indieweb.org/Micropub-extensionsでアイデア共有・実装ドキュメント化が推奨されます。
リクエストに問題があった場合、エンドポイントは適切なHTTPステータスコード(通常は400, 401, 403)を返し、説明も含めても構いません。エラー本文を返す場合、レスポンスボディは[JSON]オブジェクトでエラー内容を示すerrorプロパティを必ず一つ含めます。以下のエラーコードが定義されています:
"error":"forbidden" - 認証ユーザーに実行権限がありません。"error":"unauthorized" - リクエストにアクセストークンがありません。なおHTTP
401と403の違いに注意:403はアクセストークンありだが権限が足りない場合のみ返すべきです。"error":"insufficient_scope" -
トークンのスコープがリクエストに必要な範囲を満たしていません。クライアントは再認可を促す場合があります。"scope"属性で成功に必要なスコープを記載しても可。"error":"invalid_request" -
必須パラメータなし、またはパラメータの値に問題があった場合クライアントは想定外のerror値も汎用エラーとして扱うべきです。レスポンスボディには人間向けエラー内容を知らせるerror_descriptionプロパティも含めてよいですが、これはエンドユーザーではなく開発者向けです。
エラーレスポンスの詳細はOAuth 2 Bearer Token [RFC6750]仕様を参照してください。
GET /micropub?q=source&url=https://aaronpk.example/post/404
Authorization: Bearer xxxxxxxx
HTTP/1.1 400 Bad Request
Content-type: application/json
{
"error": "invalid_request",
"error_description": "The post with the requested URL was not found"
}
Micropubリクエストで利用される語彙は、[Microformats2]で定義された語彙を使用すべきです。Microformats2の語彙が使われる場合、クライアントおよびサーバーは少なくとも[h-entry]語彙をサポートしなければなりません。他によく利用されている語彙として、[h-event]や[h-card]があります。オブジェクトを作成する際は、そのオブジェクトの語彙をh(またはJSON構文ではtype)パラメータで示します。typeが指定されていない場合、サーバーはデフォルト値entryと見なすべきです。
この節は規範的ではありません。
作成されるオブジェクトを示すには、hというプロパティ(Microformatsオブジェクトのプロパティ名にはならない)と、その後にMicroformatsオブジェクト名を記載します。例:
h=entryh=cardh=eventh=cite新しい[h-entry]を作成するリクエストには、次のプロパティを含めることができます:
タグ付きで新規ノートを投稿し、myfavoritesocialnetworkへシンジケーションする例:
POST /micropub HTTP/1.1
Host: aaronpk.example
Authorization: Bearer XXXXXXXXXXX
Content-type: application/x-www-form-urlencoded; charset=utf-8
h=entry
&content=My+favorite+of+the+%23quantifiedself+trackers%2C+finally+released+their+official+API
&category[]=quantifiedself&category[]=api
&mp-syndicate-to=https://myfavoritesocialnetwork.example/aaronpk
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/x-www-form-urlencoded; charset=utf-8
Authorization: Bearer XXXXXXX
h=entry
&content=Hello+World
curl https://aaronpk.example/micropub -d h=entry -d "content=Hello World" -H "Authorization: Bearer XXXXXXX"
タグ付きで新しいノートを投稿し、myfavoritesocialnetworkへシンジケーションする例:
POST /micropub HTTP/1.1
Host: aaronpk.example
Authorization: Bearer XXXXXXXXXXX
Content-type: application/x-www-form-urlencoded; charset=utf-8
h=entry
&content=%40BarnabyWalters+My+favorite+for+that+use+case+is+Redis.
&in-reply-to=https://waterpigs.example/notes/4S0LMw/
&mp-syndicate-to=https://myfavoritesocialnetwork.example/aaronpk
HTMLコンテンツ付きの記事投稿例。この場合、contentプロパティはhtmlキーを含むオブジェクトとして送られます。これは、パース済み値としてHTMLを含むことを示すMicroformats
2の構文に対応しています。contentがオブジェクトのため、このリクエストはJSON形式で送信する必要があります。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"name": ["Itching: h-event to iCal converter"],
"content": [
{"html": "Now that I've been <a href=\"https://aaronparecki.com/events\">creating a list of events</a> on my site using <a href=\"https://p3k.io\">p3k</a>, it would be great if I could get a more calendar-like view of that list..."}
],
"category": [
"indieweb", "p3k"
]
}
}
埋め込み画像を含む記事を作成するには、記事のHTMLに、Media
Endpointへアップロード後に返される画像のURLを指定した<img>タグを含めてください。
まず1つ以上の画像をMedia Endpointにアップロードします。多くの場合これは記事公開前(たとえばユーザーがビジュアルエディターで執筆中に)に行われます。エディターは、ユーザーが画像をドラッグしたら即座にMedia Endpointにアップロードし、得られたURLで画像をエディター内に埋め込むことができます。このリクエストの例はMedia Endpointへのアップロードを参照してください。
ファイルをMedia Endpointにアップロードしたレスポンスとして、クライアントが記事投稿時に利用できるURLが返されます。
HTTP/1.1 201 Created
Location: https://media.example.com/file/ff176c461dd111e6b6ba3e1d05defe78.jpg
クライアントはこのURLを使用して記事に画像を埋め込むことができます。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"content": [
{"html":"<p>Hello World</p><p><img src=\"https://media.example.com/file/ff176c461dd111e6b6ba3e1d05defe78.jpg\"></p>"}
]
}
}
Micropubリクエストにファイルを含める場合、リクエスト全体はmultipart/form-data
エンコーディングで送信され、ファイル名は語彙で対応するプロパティ(audio、video、photo
のいずれか)に従って名付けます。これらのファイルは1つ以上含めても構いません。
たとえば、サービスがvideoプロパティで動画を、photoプロパティで動画のプレビューフレームを投稿することもできます。
PHPの場合、これらのファイルは$_FILES配列でアクセス可能です:
$_FILES['video']
$_FILES['photo']
$_FILES['audio']
リクエストボディがJSONエンコードの場合はファイルアップロードできません。その場合、まずMedia Endpointへ写真を送信して得られたURLをJSON投稿で指定してください。
Micropubエンドポイントはファイルを直接保存しても、Amazon S3など外部ストレージへアップロードしても構いません。
写真やその他のメディアを受け付けるMicropubエンドポイントは、クライアントがMicropubエンドポイントやMedia Endpoint以外のドメイン上のファイルURLをリクエスト内に含めるケースに遭遇することがあります(例:クライアントが独自のファイルアップロード機構を提供している場合など)。MicropubサーバーでURL値を受け入れる際の一つの防御的な方法として、MicropubサーバーのドメインやMedia Endpointなど信頼できるドメインからのメディアのみをダウンロード・保存し、それ以外はファイルのURLのみを保存する、といった実装が考えられます。
以下の質問は、「Self-Review Questionnaire: Security and Privacy」([security-privacy-questionnaire])を参考に、この仕様におけるセキュリティおよびプライバシー上の配慮事項についての概要を示しています。
以下のリンク関係型は、[RFC5988]セクション6.2.1に基づき、IANAによって登録されています:
この節は参考情報です。
この節は参考情報です。
Micropubの実装一覧はmicropub.netで見ることができます。
編集者は IndieWeb コミュニティおよびその他の実装者の方々のサポート、励まし、熱意に感謝します。特に以下の方々に感謝します。 Amy Guy、 Barry Frost、 Benjamin Roberts、 Chris Webber、 Christian Weiske、 David Shanske、 Emma Kuo、 Kyle Mahan、 Jeena Paradies、 Malcolm Blaney、 Martijn van der Ven、 Marty McGuire、 Mike Taylor、 Pelle Wessman、 Ryan Barrett、 Sandro Hawke、 Sven Knebel、および Tantek Çelik。
この節は参考情報です。
この節では、2017年4月13日PRから本バージョンまでの変更点を列挙しています。
qを削除(POSTリクエストで使われないため)mp-プロパティもJSON構文で予約されていることを明確化
この節では、2016年10月18日CRから2017年4月13日PRまでの変更点を列挙しています。
multipart/form-dataリクエストのメディア受け入れ時のサーバーに関する適合クラス記述を修正
<code>タグの利用この節では、2016年8月16日CRから2016年10月18日CRまでの変更点を列挙しています。
not_foundを削除し、3種類を推奨・他の値も許容としたこの節では、2016年7月13日WDから2016年8月16日CRまでの変更点を列挙しています。
この節では、2016年6月21日WDから2016年7月13日WDまでの変更点を列挙しています。
mp-actionをactionへ(アップデートはJSONリクエストのみのため名称変更)
この節では、2016年5月4日WDから2016年6月21日WDまでの変更点を列挙しています。
access_token値の保存について、注釈を明記
この節では、2016年3月1日WDから2016年5月4日WDまでの変更点を列挙しています。
propertiesキーの入れ子が余計だった部分を削除syndicate-toレスポンスを送信先の詳細も返すように更新
この節では、2016年1月28日FPWDから2016年3月1日WDまでの変更点を列挙しています。
1.1 Social Web作業グループ
Micropubは、Social Web作業グループによって開発されているいくつかの関連仕様の一つです。別のアプローチや補完的なプロトコルに関心のある実装者は、ActivityPubや概要ドキュメント [social-web-protocols] を参照してください。