WebDAV ~オープンデータ 時 代 の 標 準 API~ 2007/01/15 ウノウ 株 式 会 社 駒 形 真 幸 <komagata@unoh.net>
WebDAVとは? Distributed Authoring and Versioning protocol for the WWW WWW 上 で 編 集 とバージョン 管 理 が 出 来 る プロトコル 1998 年 にRFC2291で 提 唱 されたHTTP1.1の 拡 張 仕 様
主 な 実 装 サーバ Apache mod_dav IIS クライアント WindowsのExplorer Mac OS XのFinder LinuxのNautilus Dreamweaver
WebDAVの 基 本 要 素 リソース WebDAVで 扱 う 対 象 (ファイルシステムで 言 えばファイルやディレクトリ) コレクション リソースの 集 まり(ファイルシステムで 言 えばディレクトリ) プロパティ リソースの 属 性 ( 名 前 と 値 のペア) ロック 同 時 編 集 を 回 避 する 仕 組 み( 共 有 ロック 方 式 )
メソッドの 追 加 HTTP1.1からの 拡 張 点
HTTP1.1からの 拡 張 点 (2) ステータスコードの 追 加
WebDAVのリクエスト PROPFIND /DAV/setup01.jpg HTTP/1.1 Host: localhost Content-type: text/xml; charset="utf-8" Depth: 0 <?xml version="1.0" encoding="utf-8"?> <D:propfind xmlns:d="dav:"> <D:prop xmlns:r="http://localhost/boxschema/"> <R:bigbox/> <R:author/> <R:DingALing/> <R:Random/> </D:prop> </D:propfind>
WebDAVのレスポンス HTTP/1.1 207 Multi-Status Date: Thu, 18 Jan 2007 02:55:37 GMT Server: Apache/2.2.3 (Debian) DAV/2 PHP/4.4.4-8 Content-Length: 1245 Connection: close Content-Type: text/xml; charset="utf-8" <?xml version="1.0" encoding="utf-8"?> <D:multistatus xmlns:d="dav:"> <D:response xmlns:ns0="dav:" xmlns:ns1="urn:schemas-microsoftcom:" xmlns:lp1="dav:" xmlns:lp 2="http://apache.org/dav/props/"> <D:href>/dav/a.jpg</D:href> ( 略 )
枯 れた 地 味 な 技 術 新 しいファイルシステムはもういいよ nfsで 良 いんじゃ? 一 昔 前 の 技 術? 今 日 びWebDAVて
なぜ 今 WebDAVか 良 く 考 えると WebDAVは ファイルシステムじゃなくてWeb APIの 仕 様 もしかしてスゴイ 有 望 なんじゃ?
なぜ 今 WebDAVか(2) 様 々なデバイスでネットにアクセス オープンなAPIよりオープンなデータ CGMの 流 行 でネット 上 のWRITEが 増 えた
なぜ 今 WebDAVか(3) 様 々なデバイスでネットにアクセス HTTP1.1の 拡 張 仕 様 オープンなAPIよりオープンなデータ データ 向 けのXML 語 彙 CGMの 流 行 でネット 上 のWRITEが 増 えた LOCKなどのWRITE 向 けの 便 利 な 仕 様
WebDAV API Web APIとしてのWebDAV
REST REpresentational State Transfer URIで 識 別 されるリソースの 状 態 の 表 現 をGET, PUTなどの 幾 つかの 動 詞 によってやりとりするアー キテクチャースタイル HTTPプロトコルの 主 要 著 者 であるRoy Fieldingが 提 唱 した WWWと 非 常 に 相 性 が 良 い (WWW 自 体 RESTの 一 実 装 であると 言 える)
RESTなシステム Google Web API A9.comのOpenSearch Blogger API, MetaBlog API 汎 用 性 Atom Publishing Protocol(AtomPP) WebDAV!?
WebDAV vs AtomPP Web APIの 仕 様 っていったら AtomPPじゃないの? WebDAVは1999 年 にRFCになっている 対 してAtomPPは 現 在 IETFで 議 論 中 現 状 実 装 も 圧 倒 的 にWebDAVが 多 い
WebDAV vs AtomPP(2) RESTfulなAtomPPの 方 がWWWと 相 性 が 良 いんじゃないの?
Roy FieldingのREST 原 則 ステートレスなプロトコル(HTTP) 全 てのリソースに 適 用 可 能 な 操 作 のセット (GET, POST, PUT, DELETEなど) リソースを 一 意 に 識 別 できる 汎 用 的 な 構 文 (URI) 情 報 と 状 態 遷 移 の 両 方 を 扱 うことができる ハイパーメディアの 使 用 (HTMLやXML)
WebDAVはRESTful HTTP 1.1の 拡 張 PROPFIND, COPYなど 全 てのリソースに 適 用 できる 汎 用 のメソッドを 持 っている URIをベースとしている XMLを 使 ってやり 取 りしている
WebDAV vs AtomPP(3) 本 当 に 普 及 してるの? Windows, Mac OS X, Linuxで 標 準 でサポートしている 実 装 も 圧 倒 的 にWebDAVの 方 が 多 い
WebDAVの 利 点 実 は 一 番 普 及 しているWeb API ファイルシステムを 扱 うのに 十 分 なメソッドと 表 現 力 詳 細 なわりに 抽 象 度 が 高 い 仕 様 (ファイルシステム 自 体 の 抽 象 度 が 高 いので 必 然 的 にこうなった)
PHPよるサーバ 実 装 対 応 するメソッドを 実 装 するだけで 良 い require_once 'HTTP/WebDAV/Server.php'; class HTTP_WebDAV_Server_Photozou extends HTTP_WebDAV_Server { function GET(&$options) { $options['mimetype'] = 'image/jpeg'; $options['mtime'] = xxxxxx; $options['stream'] = fopen($options['path'], 'r'); return true; } function PROPFIND(&$options, &$files) { ( 略 ) } } $server = new HTTP_WebDAV_Server_Photozou(); $server->serverequest();
Javascriptによるクライアント 実 装 XHR(Xml Http Request)でWebDAVの 拡 張 メソッドを 呼 ぶことが 出 来 る var XHR = function() { return window.xmlhttprequest? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); } XHR.open('PROPFIND', 'http://foo.com/pathto, true); headers = headers {}; headers['depth'] = headers['depth']>1? 1 : headers['depth']; headers['content-type'] = headers['content-type'] 'text/xml'; for (h in headers) { XHR.setRequestHeader(h, headers[h]); } XHR.send('<?xml version="1.0"?><propfind xmlns="dav:"><allprop/></propfind>');
認 証 RESTなので 既 存 の 様 々な 認 証 方 法 が 使 えます Basic 認 証 PROPFIND /pathto HTTP/1.1 Depth: 1 Authorization: Basic a28tywdhdge6dgfryxnha2k= Digest 認 証 PROPFIND /pathto HTTP/1.1 Depth: 1 WWW-Authenticate: Digest realm="secret Zone", nonce="rmh1usdrawa=6dc290ea3304de42a7347e0a94089ff5912c e0de", algorithm=md5, qop="auth"
認 証 (2) WSSE 認 証 PROPFIND /pathto HTTP/1.1 Depth: 1 X-WSSE: UsernameToken Username="komagata", PasswordDigest="ZCNaK2jrXr4+zsCaYK/YLUxImZU=", Nonce="Uh95NQlviNpJQR1MmML+zq6pFxE=", Created="2005-01- 18T03:20:15Z"
WebDAV API 応 用 例 JavaScriptの 画 像 ブラウザ フォト 蔵 をWindowsにマウント JS 画 像 ブラウザ at フォト 蔵 Flashの 画 像 ブラウザ
JavaScriptの 画 像 ブラウザ
フォト 蔵 をWindowsにマウント
JS 画 像 ブラウザ at フォト 蔵
JS 画 像 ブラウザ at フォト 蔵
Flashの 画 像 ブラウザ
まとめ WebDAVは 有 望 なWeb API