# Webを支える技術 第4部 ハイパーメディアフォーマット② ## 第12章 Atom ### 12.1 Atomとは **Atom(Atom Syndication Format)** は、RFC4287が規定する**XMLフォーマット**の一つである。 従来のRSSが乱立した反省から、**拡張性のあるフィードの標準フォーマット**の策定を目指したものである。 検索エンジンや写真管理などの様々なWebAPIで利用されている。 ### 12.2 Atomのリソースモデル Atomの論理モデルは、メンバリソースとコレクションリソースの2つに大分される。 #### 12.2.1 メンバリソース Atomの最小のリソース単位である。(画像や記事1つ1つ) メンバリソースは、エントリリソースとメディアリソースに分かれている。 * **エントリリソース**:textやhtml等、**xml表現可能**なリソース。entry要素で囲んで表現する。(エントリ) * **メディアリソース**:画像や音声などの、エントリリソース以外のリソース。エントリリソースへのメタデータは、**メディアリンクエントリ**と呼ばれる特別なエントリで表現される。 #### 12.2.2 コレクションリソース 複数のメンバリソースを含むリソースである。 コレクションリソースは階層化が不可能なため、別のコレクションリソースを含んでいることはない。feed要素で囲んで表現する。(フィード) #### 12.2.3 メディアタイプ・その他 * メディアタイプは**application/atom+xml**である。なお、typeパラメータでエントリやフィードを明示できる。 * 拡張子(推奨)は、.atomである。 * 名前空間はhttp://www.w3.org/2005/Atom である。Atomが定義する要素(拡張要素除く)はこの名前空間に属する。 ### 12.3 エントリ ```xml= <entry xmlns="http://www.w3.org/2005/Atom"> <id>tag:example.jp, 2021-01-26:entry:1538</id> <tytle>1/26(火)の日記</tytle> <updated>2021-01-26T10:21:35Z</updated> <link href="http://example.jp/1538"/> <content>今日も仕事</content> </entry> ``` #### 12.3.1 メタデータ 以下、特記無き英語名のみの名前は、全て要素である。 * **id**:URI形式のエントリ毎にユニークなid。URIは通常**tagスキーム**と呼ばれる**HTTPとは独立したURI**が用いられる。tagスキームの例を以下の通り表す。 * **tag:ドメイン名orメールアドレス, 日付:任意の文字列**(例の文字列の場合、entry(エントリを表す):1538(データベースID)となる。) * **tytle**:**エントリのタイトル**を記述する。この記述は***必須***である。また、エントリ概要を示す**summary**要素も用意されている。 * **author**:**著者**を記述する。この記述は***必須***である。また貢献者を示す**contributer**要素も用意されている。 * **name**:自然言語で記述した名前。必須。 * **uri**:人に関連付けられたURI。任意。 * **email**:人のメールアドレス。任意。 * **updated**:更新日時を記述する。この記述は必須である。また、エントリの公開日時を表す**published**要素も用意されている。 * **category**:エントリが属するカテゴリを指定する。いわゆるタグの役割を果たす。 * **term属性**:タグ付きを意味する。タグ名を表す**term要素が必須。** * **scheme属性**:タグ識別URIを指定する。 * **label属性**:アプリケーションの表示ラベルを設定する。 * **link**:リンクについて記述する。 * **href属性**:URIを記述する。必須。 * **rel属性**:ページ間のリンク関係を表す。5つのリンク関係が定義されている。 * **type属性**:リンク先のリソースのメディアタイプを指定する。 #### 12.3.2 エントリの内容 * **組み込みで定義されている内容** entry要素は、content要素を子要素に持つ。content要素にはtype属性に従って、**text(プレーンテキスト),html(エスケープ済みhtml),xhtml**のいずれかを入れることができる。 * **XMLの内容** xml形式の及びメディアタイプに+xmlの表示がある要素は、**直接entry要素に埋め込む**ことができる。 * **テキストの内容** プレーンテキスト以外のテキストデータ(メディアタイプがtext)も直接埋め込み可能である。 * **テキスト以外の内容** テキスト以外の内容(画像や音声等)を埋め込む際は、Base64でエンコードするか、srcにメディアリソースのURIを記入して、**メディアリンクエントリ**として表現する。 ### 12.4 フィード #### 12.4.1 メタデータ * エントリと共通のメタデータ:id, tytle, author, updated * フィード独自のメタデータ * **subtitle**:タイトルで説明しきれない説明を記述する。type属性でメディアフォーマットを指定し、この値で内容が変化する。 * **generator**:フィードを生成したプログラム情報を表現する。uri属性にURI、version属性にバージョンを指定する。要素間にはプログラムの名称を挟みこむ。 * **icon**:favicon(WebサイトやWebページに関連付けられたアイコン)のアイコン名を指定する。 * **logo**:フィードを象徴する画像名を指定する。 ### 12.5 Atomの拡張 **Atomはその拡張性の高さから、ブログ以外にも様々なシステムで応用されている。** OpenSearchのような外部マークアップに対しては、任意の数だけ子要素に持つことができる。 つまり、**複数の外部マークアップを組み合わせて利用することができる**メリットを持つ。 #### 12.5.1 Atom Threading Extentions(RFC4685) 最初に紹介されているのは、あるコンテンツに対し次々とやり取りを繋げて一つの流れを作る**スレッド機能**の実現である。 フィード形式という、OpenSearch等の拡張要素を含んだデータは、Atomの形式においてもそのまま要素の利用が可能である。 以下のような表現が行える。 * ある投稿=一つのエントリに対し、複数個の返答をくっつけることができる。 * リソースに対する総返信回数と、一つのエントリに対する総返信回数を区別して記録することができる。 #### 12.5.2 Atom License Extention(RFC4946) 次に紹介されているのは、**ライセンス情報の表現**である。 クリエイティブコモンズが定義している**ライセンスリンク**に対し、rel=licenceで表現している。 entry要素やfeed要素は、複数のライセンスリンクの保持が可能である。 なお、rights要素は、人間の言葉で書かれたライセンス情報を記述する際に用いる。(ライセンスリンクとは別物) #### 12.5.3 Feed Paging and Achiving(RFC5005) 次に紹介されているのは、**フィードの分割**である。 ブログなどでは、取得される大量の検索結果を10個程度に分割して表示している。 このように複数のフィードに分けて表示(**ページ化フィード**)したり、 月ごとに表示など、エントリを分類し特定の項目を持つフィードのみを表示(**アーカイブ化フィード**)したりできる。 #### 12.5.4 OpenSearch(A9) 最後に紹介されているのは、**検索結果の表現**である。 **OpenSearch**は検索エンジンのWebAPIのベースとなる仕様であり、様々な検索サービスが活用している。 osという接頭辞が属する名前空間を持つ。 前述のフィードの分割機能を利用して、検索結果総数や最初のインデックス、1フィード当たりの最大エントリ数、検索クエリ等を表示できる。 ## 第13章 Atom Publishing Protocol(Atom Pub) ### 13.1 Atom Pubとは何か Atomがフィードやエントリといったデータフォーマットに対する仕様を規定するのに対し、 **Atom Publishing Protocol(Atom Pub)** は、Atomを利用した**リソース編集プロトコル**の規定を表す。 Atomの規定している**各リソースに対し、CRUD操作を行う**ものである。 これまで用いられてきたXML-RPCベースのリソース編集APIの国際化や拡張性の問題点を解決している。 また、AtomPubは**REST形式**のアーキテクチャスタイルを持つ。 高自由度ゆえに決まったリソース設計を持たないRESTの弱点を補うように、**基本的なリソースモデル及びリンク機能**が提供されているのも大きな特徴である。 ### 13.2 AtomPubのリソースモデル AtomPubでは、**サービス文書**(コレクションのメタデータを表現)と、**カテゴリ文書**(カテゴリに指定可能な値を列挙)が追加されている。 ### 13.3 13.4 メンバリソースの操作 13.3で紹介されているWebページをもとに、AtomPubのCRUD操作について説明されている。 #### 13.4.1 エントリ単位での操作 link要素のrel属性がrel=editのものは、編集用URI、すなわち編集リンクである。 このリンクに対し、GET、POST、PUT、DELETE各メソッドを用いてCRUD操作が行える。 #### 13.4.2 メディアリソースの操作 メディアリソース(画像など)は、エントリではないため、entry要素では送れない。 その代わり、メディアリソースの画像本体をコレクションリソースにPOSTすることで実現できる。 Slugヘッダは、画像に対しヒントになる%エンコードURIをつけることができる。 ### 13.5 サービス文書 WebAPIが持つ複数のコレクションリソースのメタデータをまとめて記述できるのが、AtomPubのサービス文書である。 メディアタイプapplication/atomsvc+xmlを持つ。 サービス文書レベルのservice要素、コレクションリソースを複数まとめたworkspace要素、コレクションリソースを格納するcollection要素 の階層構造を持つほか、コレクションリソースの受付可能なメディアタイプを表すaccept要素、そして、カテゴリを表すcatogories要素を持つ。 categories要素は、通常のカテゴリの他、外部のカテゴリ文書として表現することもできる。 また、fixed属性によって、指定したカテゴリ以外のカテゴリが利用可能かどうかを制御できる。 ### 13.6 AtomPubに向いているWebAPI ブログサービスや検索機能、マルチメディアファイルリポジトリ、タグを使ったソーシャルサービスの各APIは、Atomの要素を最大限利用できるため向いていると言える。 一方で、リアルタイム性が求められたり、データの階層構造が重要なもの、HTTP以外のプロトコルを用いるもの、メタデータが不要なAPIには向いていない。 ## 第14章 JSON ### 14.1~14.3 JSONの基礎知識 **JSON(JavaScript Object Notation)** とは、RFC4627が規定するデータ記述言語である。 **JavaScriptの記法でデータを記述できる**点が最大の特徴である。 シンプルゆえに多くの言語にライブラリが用意され、データの受け渡しにも重宝される。 WebサービスではAjax通信におけるデータフォーマットとして利用されている。 メディアタイプはapplication/jsonである。拡張子(推奨)は.jsonである。 ### 14.4 JSONのデータ型 * オブジェクト:名前と値の組み合わせ(メンバ)の集合である。メンバは常に文字列である。 * 配列:順序を持ったゼロ個以上の値の集合。 * 文字列:""でくくる。バックスラッシュを用いて、unicode番号表記やエスケープ処理、改行等を表現できる。 * 数値:整数と浮動小数点数の両方が含まれる。 * ブーリアン:リテラル(trueかfalse) * null:リテラル(null) * 日時:組み込み型としての日時型が存在しないため、UNIX時間やタイムゾーンなど、開発者側で何らかの規定を用意する必要がある。 * リンク:URIを文字列として持つ。 ### 14.5 JSONPによるクロスドメイン通信 #### 14.5.1 クロスドメイン通信の制限 不特定多数のドメインに属するサーバにアクセスする**クロスドメイン通信**は、Ajaxで用いるXMLHTTPRequestでは許可されない。 これは、不正なサーバにリクエストが渡ることを防ぐセキュリティ上の措置である。一方で、サーバ間での通信ができないことは大きな制限ともなる。 #### 14.5.2 script要素による解決 script要素で複数のサイトからJavaScriptファイルを読み込むことは可能である。 script要素は歴史的理由により、通常はブラウザのセキュリティ制限を受けないためである。 #### 14.5.3 JSONPの役割 JSONP(JSON with Padding)とは、以上の項目で説明したブラウザの性質を利用して、クロスドメイン通信を実現する手法である。 JSONPでは、オリジナルのJSONを、クライアントが指定したコールバック関数名でラップして、ドメイン名の異なるサーバからデータを取得する。 2つのscript要素の1つ目ではコールバック関数を定義し、2つ目では別のサーバからコールバック関数を呼び出す形をとる。 この、別サーバーからのコールバック関数を呼び出す役割を果たすのがJSONPである。 ### 14.6 ハイパーメディアフォーマットとしてのJSON 以上の利点を持つJSONだが、ハイパーメディアフォーマットとしての側面も忘れてはならない。 ハイパーメディアフォーマットとして扱うには、リンクの表現を行うメンバを組み込む必要がある。 ###### tags: `読書`