RESTful Webサービス

[cover photo]
  • 2007年12月 発行
  • 480ページ
  • ISBN978-4-87311-353-1
  • フォーマット Print PDF
  • 原書: RESTful Web Services

オライリー・ジャパンで書籍を購入:
定価4,104円

Ebook Storeで電子版を購入:
価格3,283円

本書は、RESTというWebのアーキテクチャスタイルについて解説する初めての本格的な書籍である。RESTFulなアーキテクチャの概念、RESTfulなサービスの特徴について述べ、RESTful Webサービスを設計するための基本的なルールであるリソース指向アーキテクチャについて解説する。現実のRESTfulなサービス、AmazonのS3、AtomPub、地図アプリケーションなどを例に挙げ、さらに、del.icio.usのAPIなど、RESTの制約を満たしていないが、よく知られているサービスを取り上げ、それらをRESTfulに再設計する方法も紹介する。RESTの概念から実装まで、深い知識が得られる本書はWeb開発者必携の一冊である。

関連書籍

Ajax on Rails
Railsレシピ
Real World HTTP
Rubyクックブック
Web API: The Good Parts
ハイパフォーマンス ブラウザネットワーキング

はじめに

1章 プログラマブルWebとWebサービス
	1.1 プログラマブルWebの概要
	1.2 HTTP:エンベロープに入ったドキュメント
	1.3 メソッド情報
	1.4 スコープ情報
	1.5 競合アーキテクチャ
		1.5.1 RESTfulリソース指向アーキテクチャ
		1.5.2 RPCスタイルのアーキテクチャ
		1.5.3 REST-RPCハイブリッドアーキテクチャ
		1.5.4 プログラマブルWebに基づく従来のWeb
	1.6 プログラマブルWebのテクノロジ
		1.6.1 HTTP
		1.6.2 URI
		1.6.3 XML-RPC
		1.6.4 SOAP
		1.6.5 WS-*
		1.6.6 WSDL
		1.6.7 WADL
	1.7 その他の用語

2章 Webサービスクライアントの作成
	2.1 WebサービスはWebサイト
		2.1.1 ラッパー、WADL、ActiveResource
	2.2 del.icio.us:サンプルアプリケーション
		2.2.1 サンプルクライアントの機能
	2.3 リクエストの作成:HTTPライブラリ
		2.3.1 オプション機能
		2.3.2 Ruby:rest-open-uriとnet/http
		2.3.3 Python:httplib2
		2.3.4 Java:HttpClient
		2.3.5 C#:System.Web.HTTPWebRequest
		2.3.6 PHP:libcurl
		2.3.7 JavaScript:XMLHttpRequest
		2.3.8 コマンドライン:curl
		2.3.9 その他の言語
	2.4 レスポンスの処理:XMLパーサー
		2.4.1 Ruby:おそらくREXML
		2.4.2 Python:ElementTree
		2.4.3 Java:javax.xml、Xerces、またはXMLPull
		2.4.4 C#:System.Xml.XmlReader
		2.4.5 PHP
		2.4.6 JavaScript:responseXML
		2.4.7 その他の言語
	2.5 JSONパーサー:直列化されたデータの処理
	2.6 WADLによるクライアントの簡易化

3章 RESTfulサービスの特徴
	3.1 S3の概要
	3.2 S3のオブジェクト指向設計
		3.2.1 バケットについて
		3.2.2 オブジェクトについて
		3.2.3 S3が標準ライブラリであったなら
	3.3 リソース
	3.4 HTTPレスポンスコード
	3.5 S3クライアント
		3.5.1 バケットリスト
		3.5.2 バケット
		3.5.3 S3オブジェクト
	3.6 リクエストの署名とアクセス制御
		3.6.1 URIの署名
		3.6.2 アクセスポリシーの設定
	3.7 S3クライアントライブラリの使用
	3.8 ActiveResourceによる透過的なクライアント
		3.8.1 簡単なサービスの作成
		3.8.2 ActiveResourceクライアント
		3.8.3 単純なサービスに対するPythonクライアント
	3.9 まとめ

4章 リソース指向アーキテクチャ(ROA)
	4.1 なぜリソース指向という用語を作るのか
	4.2 リソースとは何か
	4.3 URI
		4.3.1 URIは記述的であるべき
		4.3.2 URIとリソースの関係
	4.4 アドレス可能性
	4.5 ステートレス性
		4.5.1 アプリケーション状態とリソース状態
	4.6 表現
		4.6.1 表現の選択
	4.7 リンクと接続性
	4.8 統一インターフェイス
		4.8.1 GET、PUT、DELETE
		4.8.2 HEADとOPTIONS
		4.8.3 POST
		4.8.4 安全性とべき等性
		4.8.5 統一インターフェイスはなぜ重要なのか
	4.9 まとめ

5章 読み取り専用のリソース指向サービスの設計
	5.1 リソースの設計
	5.2 要件から読み取り専用リソースを作成する
	5.3 データセットを特定する
		5.3.1 基本レッスン
	5.4 データセットをリソースに分ける
		5.4.1 基本レッスン
	5.5 リソースに名前を付ける
		5.5.1 階層をパス変数にエンコードする
		5.5.2 階層がなければコンマまたはセミコロンを使用する
		5.5.3 アルゴリズムリソースに対するクエリ変数の使用
		5.5.4 URIの要約
	5.6 表現の設計
		5.6.1 リソースの状態を伝える表現
		5.6.2 ほかの状態にリンクする表現
		5.6.3 惑星のリストの表現
		5.6.4 地図と地図上の地点の表現
		5.6.5 地図タイルの表現
		5.6.6 惑星とその他の場所の表現
		5.6.7 検索結果のリストの表現
	5.7 リソースの相互リンク
	5.8 HTTPレスポンス
		5.8.1 想定される動作
		5.8.2 予想されるエラー
	5.9 まとめ

6章 読み取り/書き込み可能なリソース指向サービスの設計
	6.1 リソースとしてのユーザーアカウント
		6.1.1 ユーザーアカウントはなぜリソースなのか
		6.1.2 認証、認可、プライバシー、信用
		6.1.3 要件に基づき読み取り/書き込み可能なリソースを作成する
		6.1.4 データセットを特定する
		6.1.5 データセットをリソースに分ける
		6.1.6 リソースにURIで名前を付ける
		6.1.7 統一インターフェイスのサブセットを提供する
		6.1.8 クライアントから受信する表現を設計する
		6.1.9 クライアントに提供する表現を設計する
		6.1.10 このリソースを既存のリソースに統合する
		6.1.11 期待される動作
		6.1.12 予想されるエラー
	6.2 カスタムプレース
		6.2.1 データセットを特定する
		6.2.2 データセットをリソースに分ける
		6.2.3 リソースにURIで名前を付ける
		6.2.4 統一インターフェイスのサブセットを提供する
		6.2.5 クライアントから受信する表現を設計する
		6.2.6 クライアントに提供する表現を設計する
		6.2.7 このリソースを既存のリソースにリンクする
		6.2.8 期待される動作
		6.2.9 予想されるエラー
	6.3 地図サービスのまとめ

7章 サービスの実装
	7.1 ソーシャルブックマークWebサービス
	7.2 データセットの特定
	7.3 リソースの設計
		7.3.1 REST in Rails
		7.3.2 ユーザーコントローラ
		7.3.3 ブックマークコントローラ
		7.3.4 ユーザータグコントローラ
		7.3.5 カレンダーコントローラ
		7.3.6 URIコントローラ
		7.3.7 最新ブックマークコントローラ
		7.3.8 バンドルコントローラ
		7.3.9 その他
		7.3.10 REST方式へのモデルチェンジ
		7.3.11 実装:routes.rbファイル
	7.4 クライアントから受信する表現を設計する
	7.5 クライアントに提供する表現を設計する
	7.6 リソースを相互接続する
	7.7 期待される動作
	7.8 予想されるエラー
	7.9 コントローラのコード
		7.9.1 Railsがサポートしない機能
		7.9.2 ApplicationController
		7.9.3 UsersController
		7.9.4 BookmarksController
		7.9.5 TagsController
		7.9.6 あまり重要ではないコントローラ
	7.10 モデルのコード
		7.10.1 ユーザーモデル
		7.10.2 ブックマークモデル
	7.11 クライアントが知っておくべき情報
		7.11.1 自然言語によるサービスの記述
		7.11.2 標準化による記述
		7.11.3 ハイパーメディアによる記述

8章 RESTとROAのベストプラクティス
	8.1 リソース指向の基礎
	8.2 ROAの一般的な手順
	8.3 アドレス可能性
		8.3.1 表現はアドレス可能でなければならない
	8.4 状態とステートレス性
	8.5 接続性
	8.6 統一インターフェイス
		8.6.1 安全性とべき等
		8.6.2 新しいリソース:PUTとPOST
		8.6.3 POSTのオーバーロード
	8.7 重要な点
		8.7.1 アドレス可能性が重要である理由
		8.7.2 ステートレス性が重要である理由
		8.7.3 統一インターフェイスが重要である理由
		8.7.4 接続性が重要である理由
	8.8 リソースの設計
		8.8.1 リソース間の関係
		8.8.2 非同期処理
		8.8.3 一括処理
		8.8.4 トランザクション
		8.8.5 迷ったらリソースにする
	8.9 URIの設計
	8.10 出力表現
	8.11 入力表現
	8.12 サービスのバージョン管理
	8.13 永続的なURIと読み取り可能なURI
	8.14 HTTPの標準機能
		8.14.1 認証と認可
		8.14.2 圧縮
		8.14.3 条件付きGET
		8.14.4 キャッシュ
		8.14.5 石橋を叩いて渡るリクエスト
		8.14.6 部分GET
	8.15 PUTとDELETEの偽造
	8.16 Cookieの問題
	8.17 ユーザーはなぜHTTPクライアントを信頼するのか
		8.17.1 Webインターフェイスを持つアプリケーション
		8.17.2 Webインターフェイスを持たないアプリケーション
		8.17.3 解決される問題

9章 サービスの基本要素
	9.1 表現フォーマット
		9.1.1 XHTML
		9.1.2 XHTMLとマイクロフォーマット
		9.1.3 Atom
		9.1.4 SVG
		9.1.5 フォームエンコードされたキーと値の組み
		9.1.6 JSON
		9.1.7 RDFとRDFa
		9.1.8 フレームワーク固有の直列化フォーマット
		9.1.9 特別なXHTML
		9.1.10 その他のXML標準と一時的なボキャブラリ
		9.1.11 エンコーディングの問題
	9.2 パッケージ済みの制御フロー
		9.2.1 一般規則
		9.2.2 データベースと連動する制御フロー
		9.2.3 Atom Publishing Protocol
		9.2.4 GData
		9.2.5 POST Once Exactly
	9.3 ハイパーメディアテクノロジ
		9.3.1 URI Template
		9.3.2 HTML 4(XHTML)
		9.3.3 HTML 5
		9.3.4 WADL

10章 リソース指向アーキテクチャと大Webサービス
	10.1 大Webサービスが解決しようとしている問題
	10.2 SOAP
		10.2.1 リソース指向の代替策
	10.3 WSDL
		10.3.1 リソース指向の代替策
	10.4 UDDI
		10.4.1 リソース指向の代替策
	10.5 セキュリティ
		10.5.1 リソース指向の代替策
	10.6 信頼できるメッセージング
		10.6.1 リソース指向の代替策
	10.7 トランザクション
		10.7.1 リソース指向の代替策
	10.8 BPEL、ESB、SOA
	10.9 まとめ

11章 RESTクライアントとしてのAjaxアプリケーション
	11.1 AJAXからAjaxへ
	11.2 Ajaxアーキテクチャ
	11.3 del.icio.usの例
	11.4 Ajaxの利点
	11.5 Ajaxの欠点
	11.6 一歩先を行くREST
	11.7 リクエストの送信
	11.8 レスポンスの処理
	11.9 JSON
	11.10 RESTのメリットを独占しない
	11.11 クロスブラウザ問題とAjaxライブラリ
		11.11.1 Prototype
		11.11.2 Dojo
	11.12 ブラウザセキュリティモデルの崩壊
		11.12.1 プロキシ経由のリクエスト
		11.12.2 JavaScript on Demand

12章 RESTfulサービスのためのフレームワーク
	12.1 Ruby on Rails
		12.1.1 ルーティング
		12.1.2 リソース、コントローラ、ビュー
		12.1.3 出力表現
		12.1.4 入力表現
		12.1.5 WebサービスとしてのWebアプリケーション
		12.1.6 Rails/ROAの設計手順
	12.2 Restlet
		12.2.1 基本概念
		12.2.2 Restletクライアントの作成
		12.2.3 Restletサービスの作成
		12.2.4 まとめ
	12.3 Django
		12.3.1 データモデルの作成
		12.3.2 リソースの定義とURIの割り当て
		12.3.3 Djangoビューとしてのリソースの実装
		12.3.4 まとめ

付録A RESTおよびRESTfulリソースの参考文献
	A.1 規格と指針
		A.1.1 HTTPとURI
		A.1.2 RESTfulアーキテクチャ
		A.1.3 ハイパーメディアフォーマット
		A.1.4 RESTful開発のフレームワーク
		A.1.5 RESTのブログ
	A.2 利用可能なサービス
		A.2.1 サービスディレクトリ
		A.2.2 読み取り専用サービス
		A.2.3 読み取り/書き込みサービス
	A.3 日本語版読者に向けての情報
		A.3.1 HTTPとURI
		A.3.2 RESTfulなアーキテクチャ
		A.3.3 ハイパーメディアフォーマット
		A.3.4 利用可能なサービス

付録B 最もよく使用される42のHTTPレスポンスコード
	B.1 最低限必要な3〜7個のコード
	B.2 1xx:メタ
		B.2.1 100(Continue)
		B.2.2 101(Switching Protocols)
	B.3 2xx:成功
		B.3.1 200(OK) 
		B.3.2 201(Created)
		B.3.3 202(Accepted)
		B.3.4 203(Non-Authoritative Information)
		B.3.5 204(No Content)
		B.3.6 205(Reset Content)
		B.3.7 206(Partial Content)
		B.3.8 207(Multi-Status)
	B.4 3xx:リダイレクト
		B.4.1 300(Multiple Choices)
		B.4.2 301(Moved Permanently)
		B.4.3 302(Found)
		B.4.4 303(See Other)
		B.4.5 304(Not Modified)
		B.4.6 305(Use Proxy)
		B.4.7 306:未使用
		B.4.8 307(Temporary Redirect)
	B.5 4xx:クライアント側のエラー
		B.5.1 400(Bad Request)
		B.5.2 401(Unauthorized)
		B.5.3 402(Payment Required)
		B.5.4 403(Forbidden)
		B.5.5 404(Not Found)
		B.5.6 405(Method Not Allowed)
		B.5.7 406(Not Acceptable)
		B.5.8 407(Proxy Authentication Required)
		B.5.9 408(Request Timeout)
		B.5.10 409(Conflict)
		B.5.11 410(Gone)
		B.5.12 411(Length Required)
		B.5.13 412(Precondition Failed)
		B.5.14 413(Request Entity Too Large)
		B.5.15 414(Request-URI Too Long)
		B.5.16 415(Unsupported Media Type)
		B.5.17 416(Requested Range Not Satisfiable)
		B.5.18 417(Expectation Failed)
	B.6 5xx:サーバー側のエラー
		B.6.1 500(Internal Server Error)
		B.6.2 501(Not Implemented)
		B.6.3 502(Bad Gateway)
		B.6.4 503(Service Unavailable)
		B.6.5 504(Gateway Timeout)
		B.6.6 505(HTTP Version Not Supported) 

付録C 最もよく使用されるHTTPヘッダー
	C.1 標準ヘッダー
		C.1.1 Accept
		C.1.2 Accept-Charset
		C.1.3 Accept-Encoding
		C.1.4 Accept-Language
		C.1.5 Accept-Ranges
		C.1.6 Age
		C.1.7 Allow
		C.1.8 Authorization
		C.1.9 Cache-Control
		C.1.10 Connection
		C.1.11 Content-Encoding
		C.1.12 Content-Language
		C.1.13 Content-Length
		C.1.14 Content-Location
		C.1.15 Content-MD5
		C.1.16 Content-Range
		C.1.17 Content-Type
		C.1.18 Date
		C.1.19 ETag
		C.1.20 Expect
		C.1.21 Expires
		C.1.22 From
		C.1.23 Host
		C.1.24 If-Match
		C.1.25 If-Modified-Since
		C.1.26 If-None-Match
		C.1.27 If-Range
		C.1.28 If-Unmodified-Since
		C.1.29 Last-Modified
		C.1.30 Location
		C.1.31 Max-Forwards
		C.1.32 Pragma
		C.1.33 Proxy-Authenticate
		C.1.34 Proxy-Authorization
		C.1.35 Range
		C.1.36 Referer
		C.1.37 Retry-After
		C.1.38 TE
		C.1.39 Tailer
		C.1.40 Transfer-Encoding
		C.1.41 Upgrade
		C.1.42 User-Agent
		C.1.43 Vary
		C.1.44 Via
		C.1.45 Warning
		C.1.46 WWW-Authenticate
	C.2 非標準ヘッダー
		C.2.1 Cookie
		C.2.2 POE
		C.2.3 POE-Links
		C.2.4 Set-Cookie
		C.2.5 Slug
		C.2.6 X-HTTP-Method-Override
		C.2.7 X-WSSE

索 引

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]