高度な実装ガイド
概要
このドキュメントでは、Application-Level Profile Semantics (ALPS)のより高度な実装トピックについて説明します。基本的な要素や属性の説明についてはALPSリファレンスを参照してください。
ディスクリプタとリンクリレーションタイプ
表現に状態遷移を含める場合、リンクリレーションタイプの有効な値は以下のいずれかを使用できます:
- 標準リンクリレーションタイプ
- IANAやMicroformats.orgなどのレジストリに登録された短い文字列
- 例:
rel="edit"
,rel="next"
,rel="collection"
- IANAリンクリレーションを参照
- 拡張リンクリレーションタイプ ([RFC8288])
- リレーションタイプを説明する文書の完全修飾URI
- ALPSディスクリプタへのURIフラグメント識別子を含む
- 例:
rel="http://alps.io/profiles/item#purchased-by"
- 例:
rel="http://alps.io/profiles/blog#comment"
- ALPSディスクリプタID
- ALPSドキュメントの状態遷移ディスクリプタのid属性値
- 表現にALPSプロファイルが含まれる場合のみ使用可能
- 例:
rel="purchased-by"
- 例:
rel="create-comment"
リンクリレーションの競合解決
- 標準リレーションとの競合
- 状態遷移ディスクリプタが標準リンクリレーションと同じ意味を持つ場合、その意味を変更してはいけません
- 例:
edit
という名前のディスクリプタを作る場合、IANA登録済みのedit
リレーションの意味と一致する必要があります
- ID競合の解決
- 複数のディスクリプタ間でidの競合が発生する場合:
- 一意のidを定義する必要があります
- 必要に応じてname属性を使用して元の名前を保持できます
- 例:
<descriptor id="user-edit" name="edit" type="safe"> <doc>ユーザー情報の編集</doc> </descriptor>
- 複数のディスクリプタ間でidの競合が発生する場合:
既存メディアタイプとの統合
ALPSは様々な既存メディアタイプと組み合わせて使用できます。以下に主要なメディアタイプとの統合方法を説明します。
HTML
HTMLでは主にclass属性を使用してALPSディスクリプタを表現します:
<div class="blog-post">
<h1 class="title">記事タイトル</h1>
<div class="content">本文...</div>
<form class="add-comment" method="post">
<input name="comment-text" class="comment-text">
<button type="submit">コメント追加</button>
</form>
</div>
対応するALPSプロファイル:
<alps version="1.0">
<descriptor id="blog-post" type="semantic">
<descriptor id="title" type="semantic"/>
<descriptor id="content" type="semantic"/>
<descriptor id="add-comment" type="unsafe">
<descriptor id="comment-text" type="semantic"/>
</descriptor>
</descriptor>
</alps>
HAL (Hypertext Application Language)
HALではリンクリレーションとして状態遷移を、プロパティとしてセマンティックディスクリプタを表現します:
{
"_links": {
"self": {"href": "/posts/1"},
"add-comment": {"href": "/posts/1/comments"}
},
"title": "記事タイトル",
"content": "本文...",
"_embedded": {
"comments": [
{
"_links": {
"self": {"href": "/comments/1"}
},
"text": "コメント内容..."
}
]
}
}
Collection+JSON
Collection+JSONではクエリとデータ要素としてディスクリプタを表現します:
{
"collection": {
"version": "1.0",
"href": "/posts/1",
"items": [
{
"data": [
{"name": "title", "value": "記事タイトル"},
{"name": "content", "value": "本文..."}
]
}
],
"template": {
"data": [
{"name": "comment-text", "value": "", "prompt": "コメントを入力"}
]
}
}
}
ALPSドキュメントの参照
ALPSプロファイルを適用する際の参照方法について説明します。
リンクによる参照
- HTML内での参照
<link rel="profile" href="http://example.com/alps/blog" />
- HTTP Linkヘッダーでの参照
Link: <http://example.com/alps/blog>; rel="profile"
- メディアタイプパラメータでの参照
Content-Type: application/json; profile="http://example.com/alps/blog"
複数プロファイルの適用
1つの表現に複数のALPSプロファイルを適用できます:
Link: <http://example.com/alps/blog>; rel="profile",
<http://example.com/alps/comments>; rel="profile"
プロファイルの優先順位
複数のプロファイルが競合する場合の優先順位:
- メディアタイプのprofileパラメータで指定されたプロファイル
- HTTPの
Link
ヘッダーで指定されたプロファイル - 表現内で指定されたプロファイル(先に指定されたものが優先)
エラー処理とバリデーション
実装時の一般的なエラーケースと対処方法について説明します。
よくあるエラー
- 無効なディスクリプタ参照
- 解決できないURLやフラグメント識別子
- 存在しないディスクリプタへの参照
- リンクリレーションの競合
- 標準リレーションとの意味的な競合
- 複数プロファイル間でのリレーション定義の競合
- メディアタイプの制約
- 特定のメディアタイプで表現できない要素の存在
- リンク表現のサポート不足