REST  入門 株式会社リコー ソフトウェア研究開発本部 山本陽平 2005 年 11 月 24 日 第八回  XML  開発者の日
目次 はじめに アーキテクチャスタイル REST の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
自己紹介 ソフトウェア技術者、 XML guy 1975 年生まれ  ( 同い年の人の例 )  経験 Web/XML  関係でずーっと  (1994 年から ) 画像機器上の  Web  技術関係 UPnP, SOAP, etc… Java  で  Web  サービス開発 Axis, etc… REST  との出会い 2004 年 8 月、村田さんの  blog  にて それまでは  REST == XML-RPC  だと思ってた http://d.hatena.ne.jp/Nayuta/20050727#1122477974
村田さんの  blog も し か し て 今日がその日 ??
はじめに REST は~ではない XML と HTTP の組み合わせではない API の仕様ではない W3C の仕様ではない SOAP の対抗仕様ではない SOA ではない URL のパラメータをいじって XML データを得る方法ではない 今日の目的 REST の誤解を解きたい アーキテクチャスタイルの重要性を共有したい
Representational State Transfer REST  は  WWW  のアーキテクチャスタイル Roy Fielding (Apache.org  の  co-founder)  の博士論文 残念ながら日本ではマイナー ( だった ) 海外では 2002 年ごろから盛り上がっている REST  の歴史は 1996 年くらいから  (HTTP/1.1  の策定とともに ) REST  スタイルを知っていると Web  アプリ / サービスの スケーラビリティ が上がる、かもしれない Web  アプリ / サービスの ユーザビリティ が上がる、かもしれない Web  アプリ / サービスが セキュア になる、かもしれない APP   みたいなプロトコルを簡単に出せる、かもしれない いわゆる 疎結合 が実現できる、かもしれない
目次 はじめに アーキテクチャスタイル REST の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
アーキテクチャスタイルとは? 英語では “Architectural Style” ソフトウェア工学用語 別名(マクロ)アーキテクチャ パターン アーキテクチャのパターン アーキテクチャそのものではない ことに注意 ミクロアーキテクチャパターン(デザインパターン)の親戚 デザインパターンの方が細かいシステムを対象としている 代表的なアーキテクチャスタイル P2P、MVC、パイプ&フィルタ、クライアントサーバ 各スタイルはそれぞれ特徴的な 制約 の集合から成り立っている MVC: model, view, controller に役割を分担 パイプ&フィルタ: コンポーネント間のデータの流れは一方向
REST はネットワークシステムのアーキテクチャスタイル 特に  WWW  のアーキテクチャスタイル  (WWW  は  REST  のインスタンス ) クラサバ  (CS)  から派生した複合型スタイル
余談: 訳語について Architectural style  の訳語は ? (mixi  の  REST  コミュで聞いてみた ) アーキテクチャ的スタイル アーキテクチャのスタイル アーキテクチャの流儀 アーキテクチャ作法 アーキテクチャ様式 設計思想 結局「ソフトウェアエンジニアリング基礎知識体系 – SWEBOK 2004- 」に従った ■ アーキテクチャスタイル ( マクロアーキテクチャパターン ) アーキテクチャスタイルとは、「一組のアーキテクチャあるいはアーキテクチャのグループがそれを満すような、一連の制約」である。したがって、アーキテクチャスタイルは、ソフトウェアシステムのハイレベルな構成 ( マクロアーキテクチャ ) を提供するメタモデルであると見なすこともできる。
目次 はじめに アーキテクチャスタイル REST  の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
リソース (1/3) REST における超重要な概念のひとつ リソースの例 東京の天気予報 2005年11月24日のスケジュール 新花巻駅の写真 Dijkstra著 ”Go To Statement Considered Harmful” 僕の最近のブックマーク リソース = 「 名前 」のつくありとあらゆる情報 REST ではリソースをいろいろ操作する
リソース (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
リソース (3/3) 状態 リソースは状態 (state) を持つ 時間や条件とともに内容が変化する可能性がある 「 リソースの意味 」は時間や条件によらず不変である REST はリソースの  representational state  を  transfer  する 東京の明日の天気予報 (Resource) Receiver 時間による変化 晴れ 雨 1 月 5 日  AM ( 明日は晴れそう ) 1 月 5 日  PM ( 明日は雨っぽい ) 左から右に転送 ある時点におけるリソースの状態の具象的な表現
余談: リソース == オブジェクト? オブジェクトとリソースは、ちょっと違う 利用 Consumer Object Interface 転送 Consumer Resource Uniform Interface http://www.markbaker.ca/2002/09/Blog/2004/10/29#2004-10-protocols REST  のリソースモデリングをするときに  OO  の考え方が邪魔になることがある、かもしれない
質問 リソースの  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  これ
URI の貼り付け == リソースの表現の取得 URI があったらブラウザのアドレス欄に入れてみる これを REST 的に見ると URI (=  リソースの識別子 )  を使って リソースのその時点での 状態の表現 を HTTP GET  で取得  している ネットサーフィン(死語)も本質的には同じ リンククリックやフォーム入力をトリガーに、リソースのある状態の表現から(別の)リソースのある状態の表現に移る どんなリソースの URI でもアドレス欄に入力(HTTP GET)できるのがすごいところ! 天気予報でも写真でも論文でも、 HTML でも PNG でも SWF でも なぜどんなリソースでも取得できるのか? リソースを操作するインターフェースが 統一 されているから
統一インターフェース (Uniform interface) REST を構成する超重要なスタイルの一つ HTML を取得するのが  GET_HTML  で、PDF を取得するのが  GET_PDF  だったら、今の Web はどうなっていたでしょう? 統一されるのは コンポーネント 間のインターフェース ブラウザ | プロクシ | リバースプロクシ | サーバ リソースを識別する統一的な識別子の存在 URI 全てのリソースに適用できる洗練されたオペレーション (CRUD) GET リソースの取得 (Retrieve) PUT リソースの更新 (Update) DELETE リソースの削除 (Delete) POST リソースの作成 (Create …だけではない) 注意: この四つは特に重要。でも四つに限定しているわけではない
リンクをたどる -- ハイパーメディア A.html  のリンクをクリックして  B.html  へ移動 A  というリソースの表現から  B  というリソースの表現へ移動 クライアントのアプリケーションの状態が  A  から  B  になる リソース同士は単純に  URI  と  HTTP ( リンク ) で結びついている 実はこれはすごいこと 中央リンク管理 サーバや ローカル リンク管理が必要ない URI  さえあれば  HTTP  でリソースを操作できるので、アプリケーション連携がとても簡単 いわゆる 疎結合 の実現 拡張性もあるよ!
ステートレス重要 ステートレス  =  状態なし メッセージ間のコミュニケーション 状態がない 前のリクエストで ×× だったから、次のリクエストには○○で答える、という実装にしないですむ サーバ側でセッション管理しなくてよい 計算機リソースを解放できるので、 スケーラビリティ が向上 ステートレスであるためには、リクエストメッセージは 自己記述的 である必要がある Host  ヘッダ、キャッシュ情報、認証情報、など クッキーや  url-rewriting  での セッション管理 は  NG
目次 はじめに アーキテクチャスタイル REST の概要 例による  REST  ( と  SOAP  の違い )   の説明 REST アーキテクチャスタイル まとめ
REST で Web サービス Atom Publishing Protocol  っぽい例 による  Blog  編集 リソースモデル エントリ (/entry/*):  各記事 GET  記事の取得 PUT  記事の更新 DELETE  記事の削除 エントリリスト (/entlylist):  記事一覧 GET  一覧の取得 POST  新記事の作成 /entrylist 日記一覧 /entry/0 REST 入門 /entry/1 てゆーか… /entry/2 ツイてる ! /entry/3 晩ご飯は…
エントリ一覧の取得 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 する ) と…
エントリの取得 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>
エントリの更新 HTTP PUT HTTP/1.1 204 No Content 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 DELETE HTTP/1.1 204 No Content DELETE  /entry/0 HTTP/1.1 Host: example.com X-WSSE: UsernameToken…
エントリの新規作成 HTTP POST HTTP/1.1 201 Created Location: http://example.com/entry/5 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> 新規作成されたリソースの  URI
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);
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
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
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
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>
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>
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>
REST (APP) と SOAP REST URI 1 URI 2 URI 3 entrylist entry entry HTTP GET HTTP GET HTTP PUT URI 1 End point HTTP POST HTTP POST HTTP POST getEntryList() getEntry(id) putEntry(entry) SOAP
REST  と  SOAP  の違い SOAP では Web の世界 (HTTP/URI) と Web サービス世界が分かれている ×SOAP は全部  HTTP POST  を使っている ×SOAP はサービスごとの 個別インターフェース がある ×SOAP メッセージには  URI ( リンク )  が入ってない ×SOAP は HTTP を トランスポートプロトコル として使う なぜ Web と Web サービスで世界を分けるのがだめなのか キャッシュ、階層化によるスケーラビリティ、プロクシによるアクセスコントロール、・・・ 詳しくは各アーキテクチャスタイルで
目次 はじめに アーキテクチャスタイル REST の概要 例による REST (と SOAP の違い) の説明 REST  アーキテクチャスタイル まとめ
Client-Server (CS) ネットワークシステムで一番有名なスタイル 二つのコンポーネント サーバ: クライアントからのリクエストを待ちながらサービスを提供 クライアント: サービスにリクエストを投げ、レスポンスを受け取る 制約: ユーザインターフェースとデータストレージの分離 特徴 ○マルチプラットフォーム ○スケーラビリティ、サーバコンポーネントの単純化 server client
Client- Stateless -Server (CSS) ステートレス: サーバでセッション状態を持たない 制約: リクエストには 処理に必要な全ての情報 を含む 特徴 ○可視性: 一つのリクエストだけモニタリングすればよい ○信頼性: 部分的な失敗から回復 (最初からやり直さなくていい) ○スケーラビリティ: リソースをすぐに解放できる ×認証情報などを繰り返し送ることによるパフォーマンスの減少 server client client client
Client- Cache -Stateless-Server (C$SS) キャッシュ: 同じリクエストは再利用する 制約: レスポンスがキャッシュ可能かどうかラベル付け (Cache-Control, Expires, …)。キャッシュ可能なら、クライアント側で保持 特徴 ○サーバ、クライアントの 対話 を減らせる->パフォーマンス向上 ×信頼性の低下 (情報が更新されないケース) server client client client $ $
Uniform -Client-Cache-Stateless-Server (UC$SS) 統一インターフェース: REST を最も特徴付けるスタイル 制約: コンポーネント間のインターフェースを固定 特徴 ○アーキテクチャがシンプルに ○可視性の向上 ○クライアント/サーバ実装の独立性向上 ×情報粒度によってはトレードオフが発生 $ $ $ サーバ内の 実装を隠蔽
Uniform- Layered -Client-Cache-Stateless-Server (ULC$SS) 階層化システム: システムを複数階層に分割 制約: システムの知識を単一階層に限る 特徴 ○コンポーネントの単純化 (他レイヤは知らなくてすむ) ○ 中間子 の配置 (プロクシやロードバランサなど) ○レガシーシステムの封じ込め ×ネットワークオーバーヘッドによる待ち時間の増加 $ $ $ $ レガシーシステム プロクシ ゲートウェイ $ $ $
REST  = Uniform-Layered- Code-on-Demand -Client-Cache-Stateless-Server (ULCODC$SS) コードオンデマンド: クライアント側でコードをダウンロードして実行 (Flash, JavaScript) 実は REST では COD はオプション 特徴 ○クライアントを拡張できる ×可視性の低下 $ $ $ $ $ $ $
ネットワークシステムのアーキテクチャスタイル CS CSS C$SS LC$SS LCODC$SS REST Data-flow Style Replication Style Peer-to-Peer Style Hierarchical Style Mobile Code Style PF UPF RR $ LS LCS RS RDA VM REV COD MA EBI C2 DO BDO U
ネットワークシステムのアーキテクチャスタイル 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)
まとめ REST は WWW のアーキテクチャスタイル REST を知らずして  Web 2.0  を語ることなかれ REST  では  リソース が大切 REST を構成する各制約の意味をきちんと把握しよう スペック だけみてても駄目 アーキテクチャスタイル重要 ソフトウェア技術者の 基本的スキル となる
おわり
 

REST 入門

  • 1.
    REST 入門株式会社リコー ソフトウェア研究開発本部 山本陽平 2005 年 11 月 24 日 第八回 XML 開発者の日
  • 2.
    目次 はじめに アーキテクチャスタイルREST の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
  • 3.
    自己紹介 ソフトウェア技術者、 XMLguy 1975 年生まれ ( 同い年の人の例 )  経験 Web/XML 関係でずーっと (1994 年から ) 画像機器上の Web 技術関係 UPnP, SOAP, etc… Java で Web サービス開発 Axis, etc… REST との出会い 2004 年 8 月、村田さんの blog にて それまでは REST == XML-RPC だと思ってた http://d.hatena.ne.jp/Nayuta/20050727#1122477974
  • 4.
    村田さんの blogも し か し て 今日がその日 ??
  • 5.
    はじめに REST は~ではないXML と HTTP の組み合わせではない API の仕様ではない W3C の仕様ではない SOAP の対抗仕様ではない SOA ではない URL のパラメータをいじって XML データを得る方法ではない 今日の目的 REST の誤解を解きたい アーキテクチャスタイルの重要性を共有したい
  • 6.
    Representational State TransferREST は WWW のアーキテクチャスタイル Roy Fielding (Apache.org の co-founder) の博士論文 残念ながら日本ではマイナー ( だった ) 海外では 2002 年ごろから盛り上がっている REST の歴史は 1996 年くらいから (HTTP/1.1 の策定とともに ) REST スタイルを知っていると Web アプリ / サービスの スケーラビリティ が上がる、かもしれない Web アプリ / サービスの ユーザビリティ が上がる、かもしれない Web アプリ / サービスが セキュア になる、かもしれない APP みたいなプロトコルを簡単に出せる、かもしれない いわゆる 疎結合 が実現できる、かもしれない
  • 7.
    目次 はじめに アーキテクチャスタイルREST の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
  • 8.
    アーキテクチャスタイルとは? 英語では “ArchitecturalStyle” ソフトウェア工学用語 別名(マクロ)アーキテクチャ パターン アーキテクチャのパターン アーキテクチャそのものではない ことに注意 ミクロアーキテクチャパターン(デザインパターン)の親戚 デザインパターンの方が細かいシステムを対象としている 代表的なアーキテクチャスタイル P2P、MVC、パイプ&フィルタ、クライアントサーバ 各スタイルはそれぞれ特徴的な 制約 の集合から成り立っている MVC: model, view, controller に役割を分担 パイプ&フィルタ: コンポーネント間のデータの流れは一方向
  • 9.
    REST はネットワークシステムのアーキテクチャスタイル 特に WWW のアーキテクチャスタイル (WWW は REST のインスタンス ) クラサバ (CS) から派生した複合型スタイル
  • 10.
    余談: 訳語について Architecturalstyle の訳語は ? (mixi の REST コミュで聞いてみた ) アーキテクチャ的スタイル アーキテクチャのスタイル アーキテクチャの流儀 アーキテクチャ作法 アーキテクチャ様式 設計思想 結局「ソフトウェアエンジニアリング基礎知識体系 – SWEBOK 2004- 」に従った ■ アーキテクチャスタイル ( マクロアーキテクチャパターン ) アーキテクチャスタイルとは、「一組のアーキテクチャあるいはアーキテクチャのグループがそれを満すような、一連の制約」である。したがって、アーキテクチャスタイルは、ソフトウェアシステムのハイレベルな構成 ( マクロアーキテクチャ ) を提供するメタモデルであると見なすこともできる。
  • 11.
    目次 はじめに アーキテクチャスタイルREST の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
  • 12.
    リソース (1/3) RESTにおける超重要な概念のひとつ リソースの例 東京の天気予報 2005年11月24日のスケジュール 新花巻駅の写真 Dijkstra著 ”Go To Statement Considered Harmful” 僕の最近のブックマーク リソース = 「 名前 」のつくありとあらゆる情報 REST ではリソースをいろいろ操作する
  • 13.
    リソース (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
  • 14.
    リソース (3/3) 状態リソースは状態 (state) を持つ 時間や条件とともに内容が変化する可能性がある 「 リソースの意味 」は時間や条件によらず不変である REST はリソースの representational state を transfer する 東京の明日の天気予報 (Resource) Receiver 時間による変化 晴れ 雨 1 月 5 日 AM ( 明日は晴れそう ) 1 月 5 日 PM ( 明日は雨っぽい ) 左から右に転送 ある時点におけるリソースの状態の具象的な表現
  • 15.
    余談: リソース ==オブジェクト? オブジェクトとリソースは、ちょっと違う 利用 Consumer Object Interface 転送 Consumer Resource Uniform Interface http://www.markbaker.ca/2002/09/Blog/2004/10/29#2004-10-protocols REST のリソースモデリングをするときに OO の考え方が邪魔になることがある、かもしれない
  • 16.
    質問 リソースの 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 これ
  • 17.
    URI の貼り付け ==リソースの表現の取得 URI があったらブラウザのアドレス欄に入れてみる これを REST 的に見ると URI (= リソースの識別子 ) を使って リソースのその時点での 状態の表現 を HTTP GET で取得 している ネットサーフィン(死語)も本質的には同じ リンククリックやフォーム入力をトリガーに、リソースのある状態の表現から(別の)リソースのある状態の表現に移る どんなリソースの URI でもアドレス欄に入力(HTTP GET)できるのがすごいところ! 天気予報でも写真でも論文でも、 HTML でも PNG でも SWF でも なぜどんなリソースでも取得できるのか? リソースを操作するインターフェースが 統一 されているから
  • 18.
    統一インターフェース (Uniform interface)REST を構成する超重要なスタイルの一つ HTML を取得するのが GET_HTML で、PDF を取得するのが GET_PDF だったら、今の Web はどうなっていたでしょう? 統一されるのは コンポーネント 間のインターフェース ブラウザ | プロクシ | リバースプロクシ | サーバ リソースを識別する統一的な識別子の存在 URI 全てのリソースに適用できる洗練されたオペレーション (CRUD) GET リソースの取得 (Retrieve) PUT リソースの更新 (Update) DELETE リソースの削除 (Delete) POST リソースの作成 (Create …だけではない) 注意: この四つは特に重要。でも四つに限定しているわけではない
  • 19.
    リンクをたどる -- ハイパーメディアA.html のリンクをクリックして B.html へ移動 A というリソースの表現から B というリソースの表現へ移動 クライアントのアプリケーションの状態が A から B になる リソース同士は単純に URI と HTTP ( リンク ) で結びついている 実はこれはすごいこと 中央リンク管理 サーバや ローカル リンク管理が必要ない URI さえあれば HTTP でリソースを操作できるので、アプリケーション連携がとても簡単 いわゆる 疎結合 の実現 拡張性もあるよ!
  • 20.
    ステートレス重要 ステートレス = 状態なし メッセージ間のコミュニケーション 状態がない 前のリクエストで ×× だったから、次のリクエストには○○で答える、という実装にしないですむ サーバ側でセッション管理しなくてよい 計算機リソースを解放できるので、 スケーラビリティ が向上 ステートレスであるためには、リクエストメッセージは 自己記述的 である必要がある Host ヘッダ、キャッシュ情報、認証情報、など クッキーや url-rewriting での セッション管理 は NG
  • 21.
    目次 はじめに アーキテクチャスタイルREST の概要 例による REST ( と SOAP の違い ) の説明 REST アーキテクチャスタイル まとめ
  • 22.
    REST で Webサービス Atom Publishing Protocol っぽい例 による Blog 編集 リソースモデル エントリ (/entry/*): 各記事 GET 記事の取得 PUT 記事の更新 DELETE 記事の削除 エントリリスト (/entlylist): 記事一覧 GET 一覧の取得 POST 新記事の作成 /entrylist 日記一覧 /entry/0 REST 入門 /entry/1 てゆーか… /entry/2 ツイてる ! /entry/3 晩ご飯は…
  • 23.
    エントリ一覧の取得 HTTP GETGET /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 する ) と…
  • 24.
    エントリの取得 HTTP GETGET /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>
  • 25.
    エントリの更新 HTTP PUTHTTP/1.1 204 No Content 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>
  • 26.
    エントリの削除 HTTP DELETEHTTP/1.1 204 No Content DELETE /entry/0 HTTP/1.1 Host: example.com X-WSSE: UsernameToken…
  • 27.
    エントリの新規作成 HTTP POSTHTTP/1.1 201 Created Location: http://example.com/entry/5 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> 新規作成されたリソースの URI
  • 28.
    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);
  • 29.
    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
  • 30.
    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
  • 31.
    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
  • 32.
    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>
  • 33.
    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>
  • 34.
    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>
  • 35.
    REST (APP) とSOAP REST URI 1 URI 2 URI 3 entrylist entry entry HTTP GET HTTP GET HTTP PUT URI 1 End point HTTP POST HTTP POST HTTP POST getEntryList() getEntry(id) putEntry(entry) SOAP
  • 36.
    REST と SOAP の違い SOAP では Web の世界 (HTTP/URI) と Web サービス世界が分かれている ×SOAP は全部 HTTP POST を使っている ×SOAP はサービスごとの 個別インターフェース がある ×SOAP メッセージには URI ( リンク ) が入ってない ×SOAP は HTTP を トランスポートプロトコル として使う なぜ Web と Web サービスで世界を分けるのがだめなのか キャッシュ、階層化によるスケーラビリティ、プロクシによるアクセスコントロール、・・・ 詳しくは各アーキテクチャスタイルで
  • 37.
    目次 はじめに アーキテクチャスタイルREST の概要 例による REST (と SOAP の違い) の説明 REST アーキテクチャスタイル まとめ
  • 38.
    Client-Server (CS) ネットワークシステムで一番有名なスタイル二つのコンポーネント サーバ: クライアントからのリクエストを待ちながらサービスを提供 クライアント: サービスにリクエストを投げ、レスポンスを受け取る 制約: ユーザインターフェースとデータストレージの分離 特徴 ○マルチプラットフォーム ○スケーラビリティ、サーバコンポーネントの単純化 server client
  • 39.
    Client- Stateless -Server(CSS) ステートレス: サーバでセッション状態を持たない 制約: リクエストには 処理に必要な全ての情報 を含む 特徴 ○可視性: 一つのリクエストだけモニタリングすればよい ○信頼性: 部分的な失敗から回復 (最初からやり直さなくていい) ○スケーラビリティ: リソースをすぐに解放できる ×認証情報などを繰り返し送ることによるパフォーマンスの減少 server client client client
  • 40.
    Client- Cache -Stateless-Server(C$SS) キャッシュ: 同じリクエストは再利用する 制約: レスポンスがキャッシュ可能かどうかラベル付け (Cache-Control, Expires, …)。キャッシュ可能なら、クライアント側で保持 特徴 ○サーバ、クライアントの 対話 を減らせる->パフォーマンス向上 ×信頼性の低下 (情報が更新されないケース) server client client client $ $
  • 41.
    Uniform -Client-Cache-Stateless-Server (UC$SS)統一インターフェース: REST を最も特徴付けるスタイル 制約: コンポーネント間のインターフェースを固定 特徴 ○アーキテクチャがシンプルに ○可視性の向上 ○クライアント/サーバ実装の独立性向上 ×情報粒度によってはトレードオフが発生 $ $ $ サーバ内の 実装を隠蔽
  • 42.
    Uniform- Layered -Client-Cache-Stateless-Server(ULC$SS) 階層化システム: システムを複数階層に分割 制約: システムの知識を単一階層に限る 特徴 ○コンポーネントの単純化 (他レイヤは知らなくてすむ) ○ 中間子 の配置 (プロクシやロードバランサなど) ○レガシーシステムの封じ込め ×ネットワークオーバーヘッドによる待ち時間の増加 $ $ $ $ レガシーシステム プロクシ ゲートウェイ $ $ $
  • 43.
    REST =Uniform-Layered- Code-on-Demand -Client-Cache-Stateless-Server (ULCODC$SS) コードオンデマンド: クライアント側でコードをダウンロードして実行 (Flash, JavaScript) 実は REST では COD はオプション 特徴 ○クライアントを拡張できる ×可視性の低下 $ $ $ $ $ $ $
  • 44.
    ネットワークシステムのアーキテクチャスタイル CS CSSC$SS LC$SS LCODC$SS REST Data-flow Style Replication Style Peer-to-Peer Style Hierarchical Style Mobile Code Style PF UPF RR $ LS LCS RS RDA VM REV COD MA EBI C2 DO BDO U
  • 45.
    ネットワークシステムのアーキテクチャスタイル Data-flow StylePipe 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)
  • 46.
    まとめ REST はWWW のアーキテクチャスタイル REST を知らずして Web 2.0 を語ることなかれ REST では リソース が大切 REST を構成する各制約の意味をきちんと把握しよう スペック だけみてても駄目 アーキテクチャスタイル重要 ソフトウェア技術者の 基本的スキル となる
  • 47.
  • 48.