450 likes | 811 Vues
REST 入門. 2005 年 11 月 24 日 第八回 XML 開発者の日. 株式会社リコー ソフトウェア研究開発本部 山本陽平. 目次. はじめに アーキテクチャスタイル REST の概要 例による REST ( と SOAP の違い ) の説明 REST アーキテクチャスタイル まとめ. http://d.hatena.ne.jp/Nayuta/20050727#1122477974. 自己紹介. ソフトウェア技術者、 XML guy 1975 年生まれ ( 同い年の人の例 ) 経験
E N D
REST 入門 2005年11月24日 第八回 XML 開発者の日 株式会社リコー ソフトウェア研究開発本部 山本陽平
目次 • はじめに • アーキテクチャスタイル • REST の概要 • 例による REST (と SOAP の違い) の説明 • REST アーキテクチャスタイル • まとめ 2005-11-24 第八回XML開発者の日
http://d.hatena.ne.jp/Nayuta/20050727#1122477974 自己紹介 • ソフトウェア技術者、XML guy • 1975年生まれ (同い年の人の例) • 経験 • Web/XML 関係でずーっと (1994年から) • 画像機器上の Web 技術関係 • UPnP, SOAP, etc… • Java で Web サービス開発 • Axis, etc… • REST との出会い • 2004年8月、村田さんの blog にて • それまでは REST == XML-RPC だと思ってた 2005-11-24 第八回XML開発者の日
村田さんの blog も し か し て 今日がその日?? 2005-11-24 第八回XML開発者の日
はじめに • REST は~ではない • XML と HTTP の組み合わせではない • API の仕様ではない • W3C の仕様ではない • SOAP の対抗仕様ではない • SOA ではない • URL のパラメータをいじって XML データを得る方法ではない • 今日の目的 • REST の誤解を解きたい • アーキテクチャスタイルの重要性を共有したい 2005-11-24 第八回XML開発者の日
Representational State Transfer • REST は WWW のアーキテクチャスタイル • Roy Fielding (Apache.org の co-founder) の博士論文 • 残念ながら日本ではマイナー(だった) • 海外では2002年ごろから盛り上がっている • REST の歴史は1996年くらいから (HTTP/1.1 の策定とともに) • REST スタイルを知っていると • Web アプリ/サービスのスケーラビリティが上がる、かもしれない • Web アプリ/サービスのユーザビリティが上がる、かもしれない • Web アプリ/サービスがセキュアになる、かもしれない • APPみたいなプロトコルを簡単に出せる、かもしれない • いわゆる疎結合が実現できる、かもしれない 2005-11-24 第八回XML開発者の日
目次 • はじめに • アーキテクチャスタイル • REST の概要 • 例による REST (と SOAP の違い) の説明 • REST アーキテクチャスタイル • まとめ 2005-11-24 第八回XML開発者の日
アーキテクチャスタイルとは? • 英語では “Architectural Style” • ソフトウェア工学用語 • 別名(マクロ)アーキテクチャパターン • アーキテクチャのパターン • アーキテクチャそのものではないことに注意 • ミクロアーキテクチャパターン(デザインパターン)の親戚 • デザインパターンの方が細かいシステムを対象としている • 代表的なアーキテクチャスタイル • P2P、MVC、パイプ&フィルタ、クライアントサーバ • 各スタイルはそれぞれ特徴的な制約の集合から成り立っている • MVC: model, view, controller に役割を分担 • パイプ&フィルタ: コンポーネント間のデータの流れは一方向 2005-11-24 第八回XML開発者の日
目次 • はじめに • アーキテクチャスタイル • REST の概要 • 例による REST (と SOAP の違い) の説明 • REST アーキテクチャスタイル • まとめ 2005-11-24 第八回XML開発者の日
リソース (1/3) • REST における超重要な概念のひとつ • リソースの例 • 東京の天気予報 • 2005年11月24日のスケジュール • 新花巻駅の写真 • Dijkstra著 ”Go To Statement Considered Harmful” • 僕の最近のブックマーク • リソース = 「名前」のつくありとあらゆる情報 • REST ではリソースをいろいろ操作する 2005-11-24 第八回XML開発者の日
リソース (2/3) 識別子 • すべてのリソースは識別子 (identifier) を持つ • 一つのリソースに複数の識別子がつくこともある • Web では URI • 東京の天気予報 • http://weather.yahoo.co.jp/weather/jp/13/4410.html • 2005年11月24日のスケジュール • https://example.com/schedule/20051124 • 新花巻駅の写真 • http://www.flickr.com/photos/60043209@N00/6337155/ • Dijkstra 著 ”Go To Statement Considered Harmful” • http://www.acm.org/classics/oct95/ • 僕の最近のブックマーク • http://del.icio.us/yohei 2005-11-24 第八回XML開発者の日
リソース (3/3) 状態 • リソースは状態 (state) を持つ • 時間や条件とともに内容が変化する可能性がある • 「リソースの意味」は時間や条件によらず不変である • REST はリソースの representational stateを transferする 東京の明日の天気予報 (Resource) Receiver 晴れ 1月5日 AM (明日は晴れそう) ある時点におけるリソースの状態の具象的な表現 時間による変化 雨 1月5日 PM (明日は雨っぽい) 左から右に転送 2005-11-24 第八回XML開発者の日
これ 質問 • リソースの URI を与えられたら何をしますか? • 東京の天気予報 • http://weather.yahoo.co.jp/weather/jp/13/4410.html • 2005年11月24日のスケジュール • https://example.com/schedule/20051124 • 新花巻駅の写真 • http://www.flickr.com/photos/60043209@N00/6337155/ • Dijkstra 著 ”Go To Statement Considered Harmful” • http://www.acm.org/classics/oct95/ • 僕の最近のブックマーク • http://del.icio.us/yohei 2005-11-24 第八回XML開発者の日
URI の貼り付け == リソースの表現の取得 • URI があったらブラウザのアドレス欄に入れてみる • これを REST 的に見ると • URI (= リソースの識別子)を使って • リソースのその時点での状態の表現を • HTTP GETで取得 • している • ネットサーフィン(死語)も本質的には同じ • リンククリックやフォーム入力をトリガーに、リソースのある状態の表現から(別の)リソースのある状態の表現に移る • どんなリソースの URI でもアドレス欄に入力(HTTP GET)できるのがすごいところ! • 天気予報でも写真でも論文でも、 HTML でも PNG でも SWF でも • なぜどんなリソースでも取得できるのか? • リソースを操作するインターフェースが統一されているから 2005-11-24 第八回XML開発者の日
統一インターフェース (Uniform interface) • REST を構成する超重要なスタイルの一つ • HTML を取得するのが GET_HTMLで、PDF を取得するのが GET_PDFだったら、今の Web はどうなっていたでしょう? • 統一されるのはコンポーネント間のインターフェース • ブラウザ | プロクシ | リバースプロクシ | サーバ • リソースを識別する統一的な識別子の存在 • URI • 全てのリソースに適用できる洗練されたオペレーション (CRUD) • GETリソースの取得 (Retrieve) • PUTリソースの更新 (Update) • DELETEリソースの削除 (Delete) • POSTリソースの作成 (Create …だけではない) • 注意: この四つは特に重要。でも四つに限定しているわけではない 2005-11-24 第八回XML開発者の日
リンクをたどる -- ハイパーメディア • A.html のリンクをクリックして B.html へ移動 • A というリソースの表現から B というリソースの表現へ移動 • クライアントのアプリケーションの状態が A から B になる • リソース同士は単純に URI と HTTP (リンク)で結びついている • 実はこれはすごいこと • 中央リンク管理サーバやローカルリンク管理が必要ない • URI さえあれば HTTP でリソースを操作できるので、アプリケーション連携がとても簡単 • いわゆる疎結合の実現 • 拡張性もあるよ! 2005-11-24 第八回XML開発者の日
ステートレス重要 • ステートレス = 状態なし • メッセージ間のコミュニケーション状態がない • 前のリクエストで××だったから、次のリクエストには○○で答える、という実装にしないですむ • サーバ側でセッション管理しなくてよい • 計算機リソースを解放できるので、スケーラビリティが向上 • ステートレスであるためには、リクエストメッセージは自己記述的である必要がある • Host ヘッダ、キャッシュ情報、認証情報、など • クッキーや url-rewriting でのセッション管理は NG 2005-11-24 第八回XML開発者の日
目次 • はじめに • アーキテクチャスタイル • REST の概要 • 例による REST (と SOAP の違い)の説明 • REST アーキテクチャスタイル • まとめ 2005-11-24 第八回XML開発者の日
REST で Web サービス • Atom Publishing Protocol っぽい例による Blog 編集 • リソースモデル • エントリ(/entry/*): 各記事 • GET 記事の取得 • PUT 記事の更新 • DELETE 記事の削除 • エントリリスト(/entlylist): 記事一覧 • GET 一覧の取得 • POST 新記事の作成 /entry/0 REST入門 /entrylist 日記一覧 /entry/1 てゆーか… /entry/2 ツイてる! /entry/3 晩ご飯は… 2005-11-24 第八回XML開発者の日
エントリ一覧の取得 HTTP GET GET /entrylist HTTP/1.1 Host: example.com X-WSSE: UsernameToken… HTTP/1.1 200 OK Content-Type: application/atom+xml <feed> <title>yohei-y:weblog</title> <entry> <link href=“/entry/0”/> </entry> <entry> <link href=“/entry/1”/> </entry> … </feed> 各エントリへのハイパーリンク リンクを辿る(href の URI を HTTP GETする)と… 2005-11-24 第八回XML開発者の日
エントリの取得 HTTP GET GET /entry/0 HTTP/1.1 Host: example.com X-WSSE: UsernameToken… HTTP/1.1 200 OK Content-Type: application/atom+xml <entry> <title>REST 入門</title> <published >2005-11-24T23:01:01</published> <content> <p>RESTは …</p> </content> </entry> 2005-11-24 第八回XML開発者の日
エントリの更新 HTTP PUT PUT /entry/0 HTTP/1.1 Host: example.com Content-Type: application/atom+xml X-WSSE: UsernameToken… <entry> <title>REST 入門</title> <content> <p>RESTとは …</p> </content> </entry> HTTP/1.1 204 No Content 2005-11-24 第八回XML開発者の日
エントリの削除 HTTP DELETE DELETE /entry/0 HTTP/1.1 Host: example.com X-WSSE: UsernameToken… HTTP/1.1 204 No Content 2005-11-24 第八回XML開発者の日
エントリの新規作成 HTTP POST POST /entrylsit HTTP/1.1 Host: example.com Content-Type: application/atom+xml X-WSSE: UsernameToken… <entry> <title>REST 入門</title> <content> <p>RESTとは …</p> </content> </entry> HTTP/1.1 201 Created Location: http://example.com/entry/5 新規作成されたリソースの URI 2005-11-24 第八回XML開発者の日
SOAP の場合 (クライアント側プログラム) // サービスエンドポイントの初期化 BlogService bs = new BlogService(“http://example.com/servlet/blogservice”); // セッション開始 String sid = bs.startSession(“yohei”, “abc123”); // エントリ一覧の取得 Entry[] list = bs.getEntryList(sid); String eid = list[0].getEntryId(); // 先頭エントリの取得 Entry item = bs.getEntry(sid, eid); // エントリの更新 Item.setContent(“REST とは…”); bs.putEntry(sid, eid, item); // エントリの削除 bs.deleteEntry(sid, eid); // エントリの追加 bs.postEntry(sid, item); 2005-11-24 第八回XML開発者の日
SOAP の場合 startSession POST /servlet/blogservice HTTP/1.1 Host: example.com Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:startSession> <username>yohei</username> <passwd>hogehoge</passwd> </m:startSession> </s:Body> </s:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:startSessionResponse> <sid>123</sid> </m:startSessionResponse> </s:Body> </s:Envelope> セッションID 2005-11-24 第八回XML開発者の日
SOAP の場合 getEntryList POST /servlet/blogservice HTTP/1.1 Host: example.com Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:getEntryList> <sid>123</sid> </m:getEntryList> </s:Body> </s:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:getEntryListResponse> <entryList> <entry><eid>1</eid>…<entry> <entry><eid>2</eid>…</entry> </entryList> </m:getEntryListResponse> </s:Body> </s:Envelope> セッションID エントリ ID 2005-11-24 第八回XML開発者の日
SOAP の場合 getEntry POST /servlet/blogservice HTTP/1.1 Host: example.com Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:getEntry> <sid>123</sid> <eid>1</eid> </m:getEntry> </s:Body> </s:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:getEntryResponse> <entry> <title>REST入門</entry> <content>…</content> </entryList> </m:getEntryResponse> </s:Body> </s:Envelope> エントリ ID 2005-11-24 第八回XML開発者の日
SOAP の場合 putEntry POST /servlet/blogservice HTTP/1.1 Host: example.com Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:putEntry> <sid>123</sid> <eid>1</eid> <entry> <title>REST 入門</title> <content>…</content> </entry> </m:putEntry> </s:Body> </s:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:putEntryResponse /> </s:Body> </s:Envelope> 2005-11-24 第八回XML開発者の日
SOAP の場合 deleteEntry POST /servlet/blogservice HTTP/1.1 Host: example.com Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:deleteEntry> <sid>123</sid> <eid>1</eid> </m:deleteEntry> </s:Body> </s:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:deleteEntryResponse /> </s:Body> </s:Envelope> 2005-11-24 第八回XML開発者の日
SOAP の場合 postEntry POST /servlet/blogservice HTTP/1.1 Host: example.com Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:postEntry> <sid>123</sid> <entry> <title>REST 入門</title> <content>…</content> </entry> </m:postEntry> </s:Body> </s:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml <s:Envelope> <s:Body> <m:postEntryResponse> <eid>5</eid> </m:postEntryResponse> </s:Body> </s:Envelope> 2005-11-24 第八回XML開発者の日
REST entrylist HTTP GET URI 1 entry HTTP GET URI 2 entry HTTP PUT URI 3 SOAP HTTP POST getEntryList() End point HTTP POST getEntry(id) URI 1 putEntry(entry) HTTP POST REST (APP) と SOAP 2005-11-24 第八回XML開発者の日
REST と SOAP の違い • SOAP では Web の世界 (HTTP/URI) と Web サービス世界が分かれている ×SOAP は全部 HTTP POST を使っている ×SOAP はサービスごとの個別インターフェースがある ×SOAP メッセージには URI (リンク)が入ってない ×SOAP は HTTP をトランスポートプロトコルとして使う • なぜ Web と Web サービスで世界を分けるのがだめなのか • キャッシュ、階層化によるスケーラビリティ、プロクシによるアクセスコントロール、・・・ • 詳しくは各アーキテクチャスタイルで 2005-11-24 第八回XML開発者の日
目次 • はじめに • アーキテクチャスタイル • REST の概要 • 例による REST (と SOAP の違い) の説明 • REST アーキテクチャスタイル • まとめ 2005-11-24 第八回XML開発者の日
Client-Server (CS) • ネットワークシステムで一番有名なスタイル • 二つのコンポーネント • サーバ: クライアントからのリクエストを待ちながらサービスを提供 • クライアント: サービスにリクエストを投げ、レスポンスを受け取る • 制約: ユーザインターフェースとデータストレージの分離 • 特徴 ○マルチプラットフォーム ○スケーラビリティ、サーバコンポーネントの単純化 server client 2005-11-24 第八回XML開発者の日
Client-Stateless-Server (CSS) • ステートレス: サーバでセッション状態を持たない • 制約: リクエストには処理に必要な全ての情報を含む • 特徴 ○可視性: 一つのリクエストだけモニタリングすればよい ○信頼性: 部分的な失敗から回復 (最初からやり直さなくていい) ○スケーラビリティ: リソースをすぐに解放できる ×認証情報などを繰り返し送ることによるパフォーマンスの減少 client server client client 2005-11-24 第八回XML開発者の日
Client-Cache-Stateless-Server (C$SS) • キャッシュ: 同じリクエストは再利用する • 制約: レスポンスがキャッシュ可能かどうかラベル付け (Cache-Control, Expires, …)。キャッシュ可能なら、クライアント側で保持 • 特徴 ○サーバ、クライアントの対話を減らせる→パフォーマンス向上 ×信頼性の低下 (情報が更新されないケース) client $ server client client $ 2005-11-24 第八回XML開発者の日
Uniform-Client-Cache-Stateless-Server (UC$SS) • 統一インターフェース: REST を最も特徴付けるスタイル • 制約: コンポーネント間のインターフェースを固定 • 特徴 ○アーキテクチャがシンプルに ○可視性の向上 ○クライアント/サーバ実装の独立性向上 ×情報粒度によってはトレードオフが発生 $ $ サーバ内の 実装を隠蔽 $ 2005-11-24 第八回XML開発者の日
$ $ $ Uniform-Layered-Client-Cache-Stateless-Server (ULC$SS) • 階層化システム: システムを複数階層に分割 • 制約: システムの知識を単一階層に限る • 特徴 ○コンポーネントの単純化 (他レイヤは知らなくてすむ) ○中間子の配置 (プロクシやロードバランサなど) ○レガシーシステムの封じ込め ×ネットワークオーバーヘッドによる待ち時間の増加 ゲートウェイ $ $ プロクシ $ $ レガシーシステム 2005-11-24 第八回XML開発者の日
$ $ $ REST = Uniform-Layered-Code-on-Demand-Client-Cache-Stateless-Server (ULCODC$SS) • コードオンデマンド: クライアント側でコードをダウンロードして実行 (Flash, JavaScript) • 実は REST では COD はオプション • 特徴 • ○クライアントを拡張できる • ×可視性の低下 $ $ $ $ 2005-11-24 第八回XML開発者の日
Data-flow Style Mobile Code Style MA PF UPF VM REV COD U RS Replication Style $ RR RDA LS LCS Hierarchical Style Peer-to-Peer Style DO BDO C2 EBI ネットワークシステムのアーキテクチャスタイル LCODC$SS REST LC$SS CS CSS C$SS 2005-11-24 第八回XML開発者の日
Data-flow Style Pipe and Filter (PF) Uniform Pipe and Filter (UPF) Replication Style Replicated Repository (RR) Cache ($) Hierarchical Style Client-Server (CS) Layered System (LS) Layered Client-Server (LCS) Client-Stateless-Server (CSS) Client-Cache-Stateless-Server (C$SS) Layered-Client-Cache-Stateless-Server (LC$SS) Remote Session (RS) Remote Data Access (RDA) Mobile Code Style Virtual Machine (VM) Remote Evaluation (REV) Code on Demand (COD) Layered-Code-on-Demand-Client-Cache-Stateless-Server (LCODC$SS) Mobile Agent (MA) Peer-to-Peer Style Event-based Integration (EBI) C2 Distributed Object (DO) Brokered Distributed Object (BDO) Rest Uniform interface (U) ネットワークシステムのアーキテクチャスタイル 2005-11-24 第八回XML開発者の日
まとめ • REST は WWW のアーキテクチャスタイル • REST を知らずして Web 2.0を語ることなかれ • REST では リソースが大切 • REST を構成する各制約の意味をきちんと把握しよう • スペックだけみてても駄目 • アーキテクチャスタイル重要 • ソフトウェア技術者の基本的スキルとなる 2005-11-24 第八回XML開発者の日
おわり 2005-11-24 第八回XML開発者の日