『restful web サービス』読書会 第4回 9章 説明資料

44
RESTful ウェブサービス』 4 回読書会 9 章 サービスの基本要素 Siena. (2008/07/12 Sat)

Upload: siena-n

Post on 05-Jul-2015

1.956 views

Category:

Technology


4 download

DESCRIPTION

『RESTful Web サービス』読書会 第4回 9章「サービスの基本要素」 説明資料 レイアウトが崩れているので handsout.jp にも掲載

TRANSCRIPT

Page 1: 『RESTful Web サービス』読書会 第4回 9章 説明資料

『 RESTful ウェブサービス』

第 4 回読書会

第 9 章 サービスの基本要素

Siena.(2008/07/12 Sat)

Page 2: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9 章の概要• ここまでの焦点

– HTTP, URI, XML• 他に必要な追加技術 : 例えば

– ドメイン固有の XML 語彙

– 統一インタフェースを提供するための標準ルール

• 9 章の目的– ウェブサービスを改善する複数の技術の紹介

• 凡例

– 平文 , 要点 , 肯定的観点 , 否定的観点 , 個人的な補足– program code

Page 3: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9 章のおしながき

• 9.1 表現フォーマット

– XHTML, microformats, Atom, SVG, フォームエンコードされたキーと値の組 , JSON, RDF と RDFa, フレームワーク固有の直列化フォーマット , 特別な XHTML, 他の XML 標準と一時的語彙 , エンコーディングの問題

• 9.2 パッケージ済みの制御フロー

– 一般規則 , DBMS と連動する制御フロー , AtomPub, GData, POST Once Exactly

• 9.3 ハイパーメディアテクノロジ

– URI Template, HTML4 (XHTML), HTML5, WADL

Page 4: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1 表現フォーマット

Page 5: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1 表現フォーマット• 表現のフォーマットはどのようなものにすべきか

– オレオレ XML 語彙を使わないですむように

– どのような選択肢があるかの確認

• ここでの想定

– クライアントは ( サービス提供者が適切に決定した ) いかなる表現フォーマットも受入可能

– クライアントの既知の要件を優先• 例 : Excel へ直接入力されるなら CSV データを提供する

– 人間にしか理解できないドキュメント形式は除外

• 例 : オーディオデータ

Page 6: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.1 XHTML• メディアタイプ

– application/xhtml+xml– 従来の HTML (text/html) とは異なる

• IE (6 まで ?) が HTML として扱うのは text/html のみ

• XHTML でも、必要なら text/html として提供する

• HTML ファミリ

– HTML は、従来のウェブの原動力

– XHTML は、プログラマブルウェブの原動力となりえる• XHTML を妥当な XML として表現するための制約に従う

• HTML とは、いくつかの構文上の違いがある

Page 7: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.1 XHTML• XHTML と比較した HTML

– XML パーサで確実な解析はできないので勧めない

– 優れた HTML パーサが存在するので選択肢の一つ• それでもパース失敗することがしばしば

• 妥当な HTML になっていないのが原因

• 「データ提供者は規則に厳密に従い、 データ利用者は緩やかに解釈する」という原則に期待できないのが現状

– いくつかの HTML パーサは 2 章で紹介した

• 「 2.5 レスポンスの処理 – XML パーサ」のこと ?• XML パーサしか紹介されていないような

– 多くのクライアントに処理させるには XHTML を勧める

Page 8: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.1 XHTML• HTML ファミリの特徴

– 一般的なデータの多くを表現できる

• リスト , 表など

– ハイパーメディア形式が限られている– 統一インタフェースが完全にサポートされない

• HTML5 で解決される予定

– 意味的な表現力が不十分• コードや出力のみで、詩などの形式を対象としていない

– 要素内容を表すメタデータの記述力が弱い

• rel, rev 属性に指定できるのは 15 種類の関係のみ

• リストの種類を class 属性で指定しても機械可読でない

• ユーザが独自の値を定義すると相互運用性が失われる

• microformats も参照

Page 9: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.2 XHTML とマイクロフォーマット• メディアタイプ

– application/xhtml+xml

• microformats– URI: <http://microformats.org/>– XHTML にドメイン固有の意味を付与する簡易標準

– 既存の語彙を使用

– class, rel, rev 属性の値を独自に拡張定義

• 例 : hCard による自宅電話番号– <span class=“tel”> <span class=“type”>home</span> <span class=“value”>+1.415.555.1212</span></span>

Page 10: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.2 XHTML とマイクロフォーマット

• hCalendar– カレンダーやイベント情報

– IETF iCalendar フォーマットがベース

• hCard– 連絡先

– RFC 2426 (vCard) がベース

• rel-license (rel 属性値 )– 文書のライセンス条項へのリンクであることの明示– <a href= “http://creativecommons.org/ licenses/by-nd” rel=“license”>この文書のライセンス </a>

Page 11: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.2 XHTML とマイクロフォーマット

• rel-nofollow (rel 属性値 )– リンクするが、必ずしも承認するとは限らないことの明示

• rel-tag (rel 属性値 )– 外部の分類システムにしたがったラベル付けであることの明示

• VoteLinks (rev 属性値 )– rel-nofollow の概念の拡張– <a rev=“vote-for” href=“http://example.com”> 最高のページ </a>,<a rev=“vote-against” href=“http://example.com”>盗作 </a>

Page 12: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.2 XHTML とマイクロフォーマット

• XFN (XHTML Friend Network) (rel 属性値 )– 対人関係– <a rel=“spouse” href=“Bob”>Bob</a>

• XMDP (XHTML MetaData Profiles)– 定義リストを用いた XHTML の独自属性値の定義

– rel-tag などの定義に利用可能

• XOXO (Extensible Open XHTML Outlines)– リストが文書のアウトラインであることを明示

Page 13: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.2 XHTML とマイクロフォーマット

• 執筆時点で既知の microformats – microformats Wiki <http://microformats.org/wiki/>– 公式なドラフトが約 10 個

– 議論中のものが 50 個以上

• geo : 緯度・経度• hAtom : Atom を XHTML で表記

• hResume : 経歴• hReview : 批評• xFolk : ブックマーク (7 章の例に使用可能 )

Page 14: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.3 Atom• メディアタイプ

– application/atom+xml

• Atom– タイムスタンプつきのエントリのリストの説明

• 作者 , 寄稿者 , 言語 , 著作権情報 , タイトル , カテゴリなど

– ブログの更新情報のフィードなどに利用

– 乱立した RSS 群の統合と、一般化が目的

– 多くのクライアントで利用可能

• 例 9-2– URI で与えられたリソースのメタデータが記述されている

– リソースの詳細は GET して取得

Page 15: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.3 Atom• Atom の利用例

– 一般にリソースのディレクトリとみなせる• フォトギャラリーやミュージックアルバム、検索結果などに

– link などを省略可能• ステータスレポートや受信メールなどのコンテナとして

• Atom の拡張利用– 名前空間を用いて独自の語彙で追加データを記述– 汎用のコンテナとして利用可能

Page 16: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.3 Atom• OpenSearch

– Atom において、よく利用される語彙

– 検索結果一覧の表現– 独自の名前空間で追加される要素

• totalResult : 結果の合計数

• itemsPerPage : 検索結果のページ当たりの項目数

• startindex : このフィードに含まれる部分結果の開始位置

Page 17: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.4 SVG• メディアタイプ

– image/svg+xml

• SVG (Scalable Vector Graphics)– ベクトルグラフィックフォーマット

– XML で記述

Page 18: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.5 フォームエンコードされたキーと値

• メディアタイプ

– application/x-ww-form-urlencoded

• URI エンコードされたフォーム入力値

– 6 章を参照

– Ajax アプリケーションで簡単に生成可能

– CSV や RFC822 スタイルのキー値ペアを置き換え可能

– クライアントが汎用のデコードライブラリを持つ• 訳注 : 日本語の扱いに注意 , charset パラメータを使用

– 参考 : HTML4 仕様書では & 区切りでなく ; 区切りを推奨

Page 19: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.6 JSON• メディアタイプ

– application/json

• JSON (JacaScript Object Notation)– 半構造データの記述に向いた軽量フォーマット

– 2.5 節を参照

– RFC4627 で標準化

Page 20: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.7 RDF と RDFa• RDF (Resource Description Framework)

– リソースに関する知識を表現

– Semantic Web の基礎技術

• OWL や SPARQL など多段のスタック

– 機械可読な意味を表現

– URI として ISBN や URN などの抽象 URI を多様

– 三つ組み (triple) <主語 , 述語 , 目的語 >• 複数の三つ組みによりグラフを構成

• 例 9-4: “RESTful Web Services” の書籍

– 主語 : urn:isbn:...– 述語 : dc:title ( メタデータ標準 Dublin Core)– 目的語 : RESTful Web Services

主語

目的語

述語

Page 21: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.7 RDF と RDFa• RDFa

– microformats のように埋め込める

– XHTML2 を想定しており、現状では妥当ではなくなる

• eRDF– RDF アサーションを表現する第 3 の方法

– 妥当な XHTML になる

• microformats との関係– どちらもメタデータを記述する

– microformats: 軽量で簡易 , 意味を付加するのに向く

– RDF: 汎用的で多機能 , Semantic Web スタックの利

用や、既存 RDF 処理系との相互運用性が必要な場合など

Page 22: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.8 FW 固有の直接化フォーマット• メディアタイプ

– application/xml

• フレームワーク固有の XML 語彙

– Ruby: ActiveRecord– Python: Django– 例 7-4 を参照

• 7 章や 12 章で言及しているように推奨しない– 短期での開発では妥協の余地あり– フレームワーク依存– シリアライズされたデータ構造に過ぎない– 文書ではなくハイパーリンクやフォームを含まない

Page 23: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.9 特別な XHTML• メディアタイプ

– application/xhtml+xml

• 特殊な表現が必要か ?– 既存技術で表現できない正当な理由があるか再確認する

• HTML ファミリ , Atom, RDF, JSON– 問題を正しく捉えていない可能性はないか

• microformats 仕様の作成

– 可能なら公式に提案して相互運用性を確保 (仕様先

行 )– 作成文書に段階的に意味を付加し、その場限りで利用

– microformats Wiki のデザインパターンと命名規則を参照

Page 24: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.9 特別な XHTML• 主要なデザインパターン

– HTML 要素型があればそれを利用

• キー値ペア : dl• リスト : ul, ol• 適するものがない : span, div

– class 属性を指定してタグに追加の意味を付与

• 特に span, div で重要

– 関係の付与

• rel 属性 : このリソースと他のリソースとの関係

• rev 属性 : このページと他のページとの関係

• 関係が対称な場合は rel を使用

– class, rel, rev を説明する XMDP ファイルの作成を検討

Page 25: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.10 その他の XML 語彙• メディアタイプ

– application/xml

• 既存の XML 語彙の利用

– XMathML, OpenDocument, Chemical Markup Language, ...

– Dublin Core, FOAF, ... (RDF アサーションで利用可能

)

Page 26: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.10 その他の XML 語彙

• 独自 XML 語彙の作成– 本書では最後の手段とみなす– 一般には様々な語彙が作成されている

• 本書で言及したウェブサービスのほぼすべてでも

• 技術文化の違い

– microformats は新しく、非公式なものとみなされがち

– 独自 XML 語彙の作成が正当な手段のようにみなされる

– これは勘違い

• スキーマが定義されなければ、 microformats による属性の独自値の導入と同程度

• スキーマ定義は語彙を (名前空間で ) 分類可能にするのみ

• ( 独自語彙の導入という選択を ?) 正当化するものではない

Page 27: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.10 その他の XML 語彙• 適切な技術選択をせよ

– 不必要に独自定義を持ち込まない

• 既存の XML 語彙

• 既存の microformats• 検討中の他の非公式だが有力な候補の利用

– 検討の結果、必要なら独自定義を行なう

• 要素の導入が不要なら microformats の利用を検討

• 要素の導入が必要なら XML 語彙を定義

– この場合に microformats による拡張は不適切

Page 28: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.11 エンコーディングの問題• 多言語への考慮

– 文字エンコーディングを理解する

• 符号化文字集合 (CCS : Coded Character Set) • 文字符号化方式 (CES : Character Encoding Scheme)

– 言語圏ごとに様々な文字エンコーディングが存在

• Unicode– 主な符号化方式 : UTF-8 (US-ASCII 上位互換 ), UTF-

16– 多言語データを扱う最良の決断 : Unicode に統一

• 指摘されている問題も把握すべき , 盲目的に過信しない

• 文字コード検出

– Python: Univeral Encoding Detector– Ruby: chardet gem

Page 29: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.11 エンコーディングの問題• 文字コード変換時の考慮点

– 全てのテキストを UTF-* に変換– エンコーディングが未指定もしくは未知の場合

• 自動検出して変換• 理解不能なものとして拒否

• クライアントとの通信

– XML宣言で encoding を指定– <?xml version=“1.0” encoding=“utf-8”?>

Page 30: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.11 エンコーディングの問題

• XML と HTTP で競合する場合

– XML 文書中に記述されたものより、 HTTP の

Content-Type 応答ヘッダで指定されたものが優先

(RFC3023)– プログラマはこれを知らないまま、

XML 文書を作成してしまうことが多いので注意

– HTML4 以降の仕様でも同様だが知られていない ?• メディアタイプと文字エンコーディング

– 提供する XML 文書は text/xml ではなく

application/xml– charset なしの text/xml の場合は、文書中の

エンコーディング指定を無視し、 US-ASCII とみなすべき

– application/xml で XML 宣言でエンコーディングを指定

Page 31: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.1.11 エンコーディングの問題

• JSON 文書の文字エンコーディング– プレーンテキスト

• 構造化されていない• 文字エンコーディングを指定する方法がない

– このため、 JSON は文字エンコーディングを指定不可能

– RFC4627 では UTF-* であることが規定されている

• UTF-8, BOM付き UTF-16 (, US-ASCII)• 最初の 4 バイトで判別可能

Page 32: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.2 パッケージ済みの制御フロー

Page 33: 『RESTful Web サービス』読書会 第4回 9章 説明資料

• HTTP 標準応答コード– サーバから提案された制御フロー

• 参考資料– HTTP 1.1 Headers Status Diagram

<http://thoughtpad.net/alan-dean/http-headers-status.gif>– この図の方が 9.2.1, 9.2.2 より有用

9.2 パッケージ済みの制御フロー

Page 34: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.2.1 一般規則 , 9.2.2 制御フロー

• 9.2.1 一般規則– ほぼすべてのサービスに適用可能な標準的な制御フロー

– 401 : Unauthorized– 404 : Not Found– 405 : Method Not Found

• 9.2.2 DB と連動する制御フロー– メソッド別の基本的な応答コード

– GET– PUT– POST– DELETE

Page 35: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.2.3 Atom Publishing Protocol• AtomPub

– HTTP 統一インタフェース上の高水準統一インタフェース

– Atom 文書をエンドユーザに提供することが目的

– 表 9-1: AtomPub リソースとメソッド

• 構成要素– コレクション– メンバ– サービス文書– カテゴリ文書

• AtomPub メンバとしてのバイナリ文書

– URI で識別されるリソースとして同様

Page 36: 『RESTful Web サービス』読書会 第4回 9章 説明資料

4.2.3 GData• GData

– AtomPub の拡張– 新しい種類のリソースを追加– 承認メカニズムのような機能を追加

– Google で働いてないと正確なインタフェースを

サポートすることはない ?• 応用 (AtomPub + GData拡張 )

– Blogger– Google Calendar– Google Code Search– Google Spreadsheets

Page 37: 『RESTful Web サービス』読書会 第4回 9章 説明資料

4.2.3 GData• コレクションの検索

– 追加 : 検索結果のリスト

– コレクションメンバの一部の表現の GET• データ拡張

– Google Calendar の例

• gd:when• gd:who• gd:recurrence

Page 38: 『RESTful Web サービス』読書会 第4回 9章 説明資料

4.2.5 POST Once Exacly• POST の欠点

– 信頼できる HTTP を台無しにすること

– べき等ではないため、何度も送信すると異なる効果

• POE– POST をべき等にするための手段

– HTTP ヘッダに細工をする  ( 例 p.297)

Page 39: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.3 ハイパーメディアテクノロジ

Page 40: 『RESTful Web サービス』読書会 第4回 9章 説明資料

• ハイパーメディアフォーマット– リンクとフォームを構造的にサポートするフォーマット

• フォーム– アプリケーションフォーム

• アプリケーション状態の操作• リンクとあわせて本書の「接続性」を実装

• Fielding のいう「アプリケーション状態のエンジンとしてのハイパーメディア」を実装

– リソースフォーム• リソース状態の操作

• GET, DELETE は表現は不要

• POST, PUT には必要なので、それの要求の表現を伝える

9.3 ハイパーメディアテクノロジ

Page 41: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.3.1 URI Template• kunit さんにパス (w

Page 42: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.3.2 HTML 4 (XHTML)• ハイパーリンク

– a, link 要素

– href 属性

– rel, rev 属性 : microformats で属性値を拡張

• フォーム

– form 要素

• 欠点

– アプリケーションが表現できる URI には制限がある

– フォームでは GET, POST しか使えない

– クライアントの要求で送信すべき HTTPヘッダを説明不能

– フォームでキー値ペアしか表現できない– フォームで反復フィールドを定義できない

Page 43: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.3.3 HTML 5• 仕様策定中

– プログラマブルウェブを使用する上での問題の多くを解決

– 2008年末頃に勧告予定 (執筆時点 )– <http://www.w3.org/TR/2008/WD-html5-20080610/>

• フォーム

– GET, POST に加え、 PUT, DELETE をサポート

( 例 6-3)– URI Template 導入の提案あり

– 同じキー名の複数のパラメータを送ることをクライアントに伝える「反復モデル」をサポート

– フォーム入力値のシリアライズ方法の追加• キー値ペアのプレーンテキストとして

• XML 語彙を用いて (application/x-www-form+xml)

Page 44: 『RESTful Web サービス』読書会 第4回 9章 説明資料

9.3.4 WADL• まにあわなーい