Webを支える技術 HTTP,URI,HTML,そしてREST
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
技術評論社
著者:山本陽平
はじめに
第1部 Web概論
第1章 Webとは何か
1.1 すべての基盤であるWeb
1.2 さまざまなWebの用途
Webサイト
ユーザインタフェースとしてのWeb
プログラム用APIとしてのWeb
1.3 Webを支える技術
HTTP,URI,HTML
ハイパーメディア
分散システム
1.4 本書の構成
第2章 Webの歴史
2.1 Web以前のインターネット
2.2 Web以前のハイパーメディア
Memex ── ハイパーメディアの起源
Xanadu ── 「ハイパーメディア」という言葉の誕生
HyperCard ── 初の実用的なハイパーメディア
Web以前のハイパーメディアの問題点
2.3 Web以前の分散システム
集中システムと分散システム
RPC ── ほかのコンピュータの機能を利用
CORBA,DCOM ── 分散オブジェクトへの進化
Web以前の分散システムの問題点
2.4 Webの誕生
ハイパーメディアとしてのWeb
分散システムとしてのWeb
2.5 Webの標準化
Webの仕様策定
RESTの誕生
さまざまなハイパーメディアフォーマットの誕生
2.6 Web APIをめぐる議論
SOAPとWS-*
SOAP対REST
RESTの誤解と普及
SOAPとWS-*の敗因
2.7 すべてがWebへ
第3章 REST ── Webのアーキテクチャスタイル
3.1 アーキテクチャスタイルの重要性
3.2 アーキテクチャスタイルとしてのREST
3.3 リソース
リソースの名前としてのURI
リソースのアドレス可能性
複数のURIを持つリソース
リソースの表現と状態
3.4 スタイルを組み合わせてRESTを構成する
クライアント/サーバ
ステートレスサーバ
キャッシュ
統一インタフェース
階層化システム
コードオンデマンド
REST = ULCODC$SS
3.5 RESTの2つの側面
RESTとハイパーメディア
RESTと分散システム
3.6 RESTの意義
第2部 URI
第4章 URIの仕様
4.1 URIの重要性
4.2 URIの構文
簡単なURIの例
複雑なURIの例
4.3 絶対URIと相対URI
ベースURI
リソースのURIをベースURIとする方法
ベースURIを明示的に指定する方法
4.4 URIと文字
URIで使用できる文字
%エンコーディング
%エンコーディングの文字エンコーディング
4.5 URIの長さ制限
4.6 さまざまなスキーム
4.7 URIの実装で気をつけること
第5章 URIの設計
5.1 クールなURIは変わらない
5.2 URIを変わりにくくするためには
プログラミング言語に依存した拡張子やパスを含めない
メソッド名やセッションIDを含めない
URIはリソースを表現する名詞にする
URIの設計指針
5.3 URIのユーザビリティ
5.4 URIを変更したいとき
5.5 URI設計のテクニック
拡張子で表現を指定する
コンテントネゴシエーション
言語を指定する拡張子
マトリクスURI
5.6 URIの不透明性
5.7 URIを強く意識する
第3部 HTTP
第6章 HTTPの基本
6.1 HTTPの重要性
6.2 TCP/IPとは何か
階層型プロトコル
ネットワークインタフェース層
インターネット層
トランスポート層
アプリケーション層
6.3 HTTPのバージョン
HTTP 0.9 ── HTTPの誕生
HTTP 1.0 ── HTTP最初の標準化
HTTP 1.1 ── HTTPの完成
その後のHTTP
6.4 クライアントとサーバ
6.5 リクエストとレスポンス
クライアントで行われること
サーバで行われること
6.6 HTTPメッセージ
リクエストメッセージ
リクエストライン
ヘッダ
ボディ
レスポンスメッセージ
ステータスライン
ヘッダ
ボディ
HTTPメッセージの構成要素
6.7 HTTPのステートレス性
ハンバーガーショップの例
アプリケーション状態
ステートフルの欠点
ステートレスの利点
ステートレスの欠点
パフォーマンスの低下
通信エラーヘの対処
6.8 シンプルなプロトコルであることの強み
第7章 HTTPメソッド
7.1 8つしかないメソッド
7.2 HTTPメソッドとCRUD
7.3 GET ── リソースの取得
7.4 POST ── リソースの作成,追加
子リソースの作成
リソースへのデータの追加
ほかのメソッドでは対応できない処理
7.5 PUT ── リソースの更新,作成
リソースの更新
リソースの作成
POSTとPUTの使い分け
7.6 DELETE ── リソースの削除
7.7 HEAD ── リソースのヘッダの取得
7.8 OPTIONS ── リソースがサポートしているメソッドの取得
7.9 POSTでPUT/DELETEを代用する方法
_methodパラメータ
X-HTTP-Method-Override
7.10 条件付きリクエスト
7.11 べき等性と安全性
PUTはべき等
DELETEもべき等
GETとHEADもべき等,そのうえ安全
安全でもべき等でもないPOST
7.12 メソッドの誤用
GETが安全でなくなる例
ほかのメソッドでできることにPOSTを誤用した例
PUTがべき等でなくなる例
DELETEがべき等でなくなる例
7.13 Webの成功理由はHTTPメソッドにあり
第8章 ステータスコード
8.1 ステータスコードの重要性
8.2 ステータスラインのおさらい
8.3 ステータスコードの分類と意味
8.4 よく使われるステータスコード
200 OK ── リクエスト成功
201 Created ── リソースの作成成功
301 Moved Permanently ── リソースの恒久的な移動
303 See Other ── 別URIの参照
400 Bad Request ── リクエストの間違い
401 Unauthorized ── アクセス権不正
404 Not Found ── リソースの不在
500 Internal Server Error ── サーバ内部エラー
503 Service Unavailable ── サービス停止
8.5 ステータスコードとエラー処理
プロトコルに従ったフォーマットでエラーを返す
Acceptヘッダに応じたフォーマットでエラーを返す
8.6 ステータスコードの誤用
8.7 ステータスコードを意識して設計する
第9章 HTTPヘッダ
9.1 HTTPヘッダの重要性
9.2 HTTPヘッダの生い立ち
9.3 日時
9.4 MIMEメディアタイプ
Content-Type ── メディアタイプを指定する
charsetパラメータ ── 文字エンコーディングを指定する
9.5 言語タグ
9.6 コンテントネゴシエーション
Accept ── 処理できるメディアタイプを伝える
Accept-Charset ── 処理できる文字エンコーディングを伝える
Accept-Language ── 処理できる言語を伝える
9.7 Content-Lengthとチャンク転送
Content-Length ── ボディの長さを指定する
チャンク転送 ── ボディを分割して転送する
9.8 認証
Basic認証
Digest認証
チヤレンジ
ダイジェストの生成と送信
Digest認証の利点と欠点
WSSE認証
9.9 キャッシュ
キャッシュ用ヘッダ
Pragma一キヤツシュを抑制する
Expires―キャッシュの有効期限を示す
Cache Controトー詳細なキャッシュ方法を指定する
キヤツシュ用ヘッダの使い分け
条件付きGET
If-Modined-Since―リソースの更新日時を条件にする
If-None-Match―リツースのETagを条件にする
If-Modined-SinceとIf-None-Matchの使い分け
9.10 持続的接続
9.11 そのほかのHTTPヘッダ
Content-Disposition ── ファイル名を指定する
Slug ── ファイル名のヒントを指定する
9.12 HTTPヘッダを活用するために
第4部 ハイパーメディアフォーマット
第10章 HTML
10.1 HTMLとは何か
10.2 メディアタイプ
10.3 拡張子
10.4 XMLの基礎知識
XMLの木構造
要素
要素の木構造
空要素
属性
実体参照と文字参照
コメント
XML宣言
名前空間
要素の名前空間
属性の名前空間
10.5 HTMLの構成要素
ヘッダ
ボディ
プロックレベル要素
インライン要素
共通の属性
10.6 リンク
<a>要素 ── アンカー
<link>要素
オブジェクトの埋め込み
フォーム
フォームによるGET
フォームによるPOST
10.7 リンク関係 ── リンクの意味を指定する
rel属性
microformats
10.8 ハイパーメディアフォーマットとしてのHTML
第11章 microformats
11.1 シンプルなセマンティックWeb
11.2 セマンティクス(意味論)とは
言語学における意味論
プログラミング言語における意味論
Webにおける意味論
11.3 RDFとmicroformats
RDFの場合
microformatsの場合
11.4 microformatsの標準化
11.5 microformatsの分類
elemental microformats
rel-license―ライセンス情報
rel-nofollow―スパムリンク防止
compound microformats
hCaiendar―イベント情報
hAtom―更新情報
11.6 microformatsとRDFa
microformatsの問題点
RDFaでの解決(と残る問題点)
11.7 microformatsの可能性
Tim Brayの疑問
hAtom/xFolkとLDRize/AutoPagerize
11.8 リソースの表現としてのmicroformats
第12章 Atom
12.1 Atomとは何か
12.2 Atomのリソースモデル
メンバリソース
コレクションリソース
メディアタイプ
拡張子
名前空間
12.3 エントリ ── Atomの最小単位
メタデータ
ID
タイトルと概要
著者と貢献者
公開日時と更新日時
カテゴリ
リンク
エントリの内容
組込みで定義されている内容―プレーンテキスト、エスケープ済みHTML、XHTML
XMLの内容
テキストの内容
テキスト以外の内容
12.4 フィード ── エントリの集合
エントリと共通のメタデータ
フィード独自のメタデータ
12.5 Atomの拡張
Atom Threading Extensions ── スレッドを表現する
名前空間
<thr:in-reply-to>要素
repliesリンク関係とthr:count属性/thr:updated属性
<ihr:total>要素
Atom License Extension ── ライセンス情報を表現する
名前空間
複数ライセンス
ライセンスを指定しない場合
Atomの<rights>要素との関係
Feed Paging and Archiving ── フィードを分割する
名前空間
フイードの種類
完全フィード
ベージ化フィード
アーカイブ済みフイード
OpenSearch ── 検索結果を表現する
名前空間
<os:totalResults>要素
<os:starIndex>要素
<os:itemsPerPage>要素
<os:Query>要素
リンク関係
12.6 Atomを活用する
第13章 Atom Publishing Protocol
13.1 Atom Publishing Protocolとは何か
AtomとAtomPub
AtomPubの意義
AtomPubとREST
13.2 AtomPubのリソースモデル
13.3 ブログサービスを例に
13.4 メンバリソースの操作
エントリ単位での操作
GET―エントリの取得
PUT―エントリの更新
DELETE一エントリの削除
POST―エントリの作成
メディアリソースの操作
メディアリソースの作成
メデイアリソースの更新
13.5 サービス文書
メディアタイプ
<service>要素
<workspace>要素
<accept>要素
カテゴリ
カテヨリ文書
カテゴリの追加
13.6 AtomPubに向いているWeb API
第14章 JSON
14.1 JSONとは何か
14.2 メディアタイプ
14.3 拡張子
14.4 データ型
オブジェクト
配列
文字列
数値
ブーリアン
null
日時
リンク
14.5 JSONPによるクロスドメイン通信
クロスドメイン通信の制限
<script>要素による解決
コールバック関数を活用するJSONP
14.6 ハイパーメディアフォーマットとしてのJSON
第5部 Webサービスの設計
第15章 読み取り専用のWebサービスの設計
15.1 リソース設計とは何か
15.2 リソース指向アーキテクチャのアプローチ
15.3 郵便番号検索サービスの設計
15.4 Webサービスで提供するデータを特定する
15.5 データをリソースに分ける
15.6 リソースにURIで名前を付ける
郵便番号リソース
検索結果リソース
地域リソース
トップレベルリソース
15.7 クライアントに提供するリソースの表現を設計する
XML表現
今回の選択
軽量フォーマット表現
今回の選択
URIで表現を指定する
15.8 リンクとフォームを利用してリソース同士を結び付ける
検索結果リソース
地域リソース
郵便番号リソース
トップレベルリソース
地域リソース一覧
検索結果を生成するフォーム
リソース間のリンク関係
15.9 イベントの標準的なコースを検討する
15.10 エラーについて検討する
存在しないURIを指定した
必須パラメータを指定していない
サポートしないメソッドを使用した
15.11 リソース設計のスキル
第16章 書き込み可能なWebサービスの設計
16.1 書き込み可能なWebサービスの難しさ
16.2 書き込み可能な郵便番号サービスの設計
16.3 リソースの作成
ファクトリリソースによる作成
PUTによる作成
16.4 リソースの更新
バルクアップデート
パーシャルアップデート
更新できないプロパティを更新しようとした場合
16.5 リソースの削除
16.6 バッチ処理
バッチ処理のリクエスト
バッチ処理のレスポンス
207 Multi-Status-複数の結果を表現する
独自の複数ステータスフォーマット
16.7 トランザクション
解決すべき問題
トランザクションリソース
トランザクションの開始
トランザクションリソースへの処理対象の追加
トランザクションの実行
トランザクション理祖巣の削除
トランザクションリソース以外の解決方法
バッチ処理のトランザクション化
上位リソースに対する操作
16.8 排他制御
解決すべき問題
悲観的ロック
LOCK/UNLOCK
ロックリソースの導入
楽観的ロック
条件付きPUT
条件付きDELETE
16.9 設計のバランス
第17章 リソースの設計
17.1 リソース指向アーキテクチャのアプローチの落とし穴
17.2 関係モデルからの導出
郵便番号データのER図
中心となるテーブルからのリソースの導出
リソースが持つデータの特定
検索結果リソースの導出
階層の検討
トップレベルリソース
リンクによる結合
まとめ
17.3 オブジェクト指向モデルからの導出
郵便番号データのクラス図
主要データクラスからのリソースの導出
オブジェクトの操作結果リソース
階層の検討
トップレベルリソース
リンクによる結合
まとめ
17.4 情報アーキテクチャからの導出
日本郵便のWebサイトの情報アーキテクチャ
トップページ
全国地図からの検索
住所での検索
郵便番号での検索
パンくずリスト
まとめ
17.5 リソース設計で最も重要なこと
付録
付録A ステータスコード一覧
A.1 1xx(処理中)
100 Continue
101 Switching Protocols
A.2 2xx(成功)
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
A.3 3xx(リダイレクト)
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirected
A.4 4xx(クライアントエラー)
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Request Entity Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not Satisfiable
417 Expectation Failed
422 Unprocessable Entity
423 Locked
424 Failed Dependency
A.5 5xx(サーバエラー)
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
付録B HTTPヘッダ一覧
B.1 サーバ情報
Date
Retry-After
Server
Set-Cookie
B.2 クライアント情報
Cookie
Expect
From
Referer
User-Agent
B.3 リソース情報
Content-Encoding
Content-Language
Content-Length
Content-MD5
Content-Type
Content-Location
Last-Modified
Location
Host
B.4 コンテントネゴシエーション
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Vary
B.5 条件付きリクエスト
ETag
If-None-Match
If-Modified-Since
If-Match
If-Unmodified-Since
B.6 部分的GET
Range
If-Range
Accept-Range
Content-Range
B.7 キャッシュ
Pragma
Cache-Control
Expires
Age
B.8 認証
WWW-Authenticate
Authorization
Proxy-Authenticate
Proxy-Authorization
X-WSSE
B.9 チャンク転送
Transfer-Encoding
Trailer
TE
B.10 そのほか
Allow
Connection
Max-Forwards
Upgrade
Via
Warning
Content-Disposition
Slug
X-HTTP-Override
付録C 解説付き参考文献
あとがき
索引