たけまる / Perl - APP サーバ・クライアントを実装しました
2007-07-26
_
Perl - APP サーバ・クライアントを実装しました [atompub][perl]



(2007-12-07 追記) gihyo.jp から来た方へ- Reference Implementation (仕様確認用の実装) については [2007-11-19-2]
を見てください.認証に必要な情報なども書いてあります.
(2007-09-13 追記) 現在は CPAN から入手できます
- クライアント: Atompub [2007-08-12-1]
- サーバ: Catalyst::Controller::Atompub [2007-09-13-1]
7/30 の InteropTokyo で使う APP サーバ・クライアントができ
ました.実装した機能の一覧表と,使い方を簡単に紹介します.サーバを
走らせておきますので,接続してみてください.
バグを見つけたら takemaru _ teahut.sakura.ne.jp までお願いします
m(_ _)m
APP については,以下のページを参考にしてください.
たけまる / Atom Publishing Protocol のメモ
IBM Atom 出版プロトコルを知る、第1回: Atom 出版プロトコルを使って… - Japan
■ 実装機能
I-D v.17 に従って実装してあります.
サーバ | クライアント | |
ベーシック認証 | o | o |
サービス文書 | o | o |
Entry Resource (CRUD) | o | o |
Media Resource (CRUD) | o | o |
Slug ヘッダ | o | o |
Location/Content-Location ヘッダ | o | o |
キャッシュ (Etag/IF-MATCH ヘッダ) | o | o |
メディアタイプ制限 (app:accept) | o | o |
カテゴリ制限 (app:categories) | o | o |
ソート (app:edited) | o | - |
ページング (Feed) | o | - |
app:control | △ | - |
MUST あるいは SHOULD となっている機能はすべて実装したつもりです.
といっても,たぶん漏れがあるので,Interop で明らかにします ;-)
今回は Perl モジュールの APP 機能試験が目的なので,アプリケーショ
ンとしての体裁は整えていません.Entry Resource (XML) や Media
Resource (バイナリ) の交換はできますが,Blog のような気の利いた
HTML 表示はありません.
■ 使い方: クライアント
簡単な APP クライアントを使って,サービス文書の取得から Media
Resource の作成までをやってみます.
ソースコード AtomPP.tar.gz を解凍します.
解凍ディレクトリに含まれる ./script/atompp_client.pl がクライアン
トです.引数をとらずに実行するとヘルプが表示されます.
# README にある Perl Module をインストールしておいてください.
$ ./script/atompp_client.pl Usage: atompp_client.pl [OPTION]... -m, --method=METHOD HTTP Method (GET/POST/PUT/DELETE) -d, --document=DOC document (service/categories/feed/entry/media) -h, --uri=URI URI -x, --proxy=PROXY URI of proxy server -u, --username=USER username -p, --password=PASS password -s, --slug=SLUG Slug header -i, --input=FILE filename of input -c, --content-type=TYPE content type of input file -o, --output=FILE filename of output -y, --yaml YAML mode for input/output
サービス文書の URI と認証情報は次の通りです.
URI | http://teahut.sakura.ne.jp:3000/service/ |
user | foo |
pass | foo |
サービス文書を取得します.
$ ./script/atompp_client.pl -m GET -d service \ -h http://teahut.sakura.ne.jp:3000/service/ -u foo -p foo <?xml version="1.0" encoding="utf-8"?> <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace xmlns:atom="http://www.w3.org/2005/Atom"> <atom:title>AtomPP</atom:title> <collection xmlns:atom="http://www.w3.org/2005/Atom" href="http://teahut.sakura.ne.jp:3000/entry/"> <atom:title>My Blog Entries</atom:title> <categories xmlns:default="http://www.w3.org/2005/Atom" fixed="yes" scheme="http://example.com/cats/big3"> <atom:category xmlns="http://www.w3.org/2005/Atom" term="animal"/> <atom:category xmlns="http://www.w3.org/2005/Atom" term="vegetable"/> <atom:category xmlns="http://www.w3.org/2005/Atom" term="mineral" scheme="http://example.com/dogs/big3"/> </categories> </collection> <collection xmlns:atom="http://www.w3.org/2005/Atom" href="http://teahut.sakura.ne.jp:3000/media/"> <atom:title>Pictures</atom:title> <accept>image/png</accept> <accept>image/jpeg</accept> <accept>image/gif</accept> </collection> </workspace> </service>
2 つのコレクションがあります.それぞれ,Entry Resource と Media
Resource を管理しています (app:accept から判断).ここでは,Media
Resource を作成してみます.コレクションの URI は
http://teahut.sakura.ne.jp:3000/media/ です.
$ ./script/atompp_client.pl -m POST -d media \ -h http://teahut.sakura.ne.jp:3000/media/ -u foo -p foo \ -s media1 -i t/media/media1.png <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> <title>media1</title> <link rel="edit" href="http://teahut.sakura.ne.jp:3000/media/media1"/> <link rel="edit-media" href="http://teahut.sakura.ne.jp:3000/media/src/media1"/> <id>http://teahut.sakura.ne.jp:3000/media/media1</id> <content type="image/gif" src="http://teahut.sakura.ne.jp:3000/media/src/media1"/> <app:edited>2007-07-25T15:23:53Z</app:edited> </entry>Media Resource へのリンクを持つ Media Link Entry が返ってきます.
フィードを取得して,Media Resource が作成されていることを確認しま
す.
$ ./script/atompp_client.pl -m GET -d feed \ -h http://teahut.sakura.ne.jp:3000/media/ -u foo -p foo <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> <title>Pictures</title> <link rel="self" href="http://teahut.sakura.ne.jp:3000/media/"/> <link rel="first" href="http://teahut.sakura.ne.jp:3000/media/"/> <link rel="last" href="http://teahut.sakura.ne.jp:3000/media/"/> <entry xmlns:app="http://www.w3.org/2007/app"> <title>media1</title> <link rel="edit" href="http://teahut.sakura.ne.jp:3000/media/media1"/> <link rel="edit-media" href="http://teahut.sakura.ne.jp:3000/media/src/media1"/> <id>http://teahut.sakura.ne.jp:3000/media/media1</id> <content type="image/gif" src="http://teahut.sakura.ne.jp:3000/media/src/media1"/> <app:edited>2007-07-25T15:23:53Z</app:edited> </entry> </feed>
■ 使い方: サーバ
ソースコード AtomPP.tar.gz を解凍します.
# README にある Perl Module をインストールしておいてください.
コレクションの設定方法を説明します.コレクションは YAML
(atompp.yml) で設定します.現在は,Entry Resource と Media
Resource が 1 つずつです.それぞれの Path は /entry/, /media/ です.
author を指定すると,フィードに /feed/author/name が追加されます.
以下に atompp.yml の設定例を示します.
collection: entry: title: My Blog Entries categories: - fixed: yes scheme: http://example.com/cats/big3 category: - term: animal - term: vegetable - term: mineral scheme: http://example.com/dogs/big3 author: Foo media: title: Pictures accept: - image/png - image/jpeg - image/gif
認証情報と Entry/Media Resource は DB に格納します.スキーマは
./script/atompp.sql です (MySQL 5.0).
$ mysql -u <user> -p<pass> -h <host> <DB> < ./script/atompp.sql
Catalyst を起動します.
$ ./script/atompp_server.pl
ブラウザで http://localhost:3000/service/ にアクセスすると,サービ
ス文書を取得できます.
■ 今後の開発予定
今回は,APP 機能をモジュールとして実装していません.Interop で相互
運用の目処が立ったら,モジュールとして実装するかもしれません (おそ
らく,Catalyst Plugin として).そうすると,APP を使ったアプリケー
ション開発がだいぶラクになると思います.
やろうと思ってるコトはこんな感じです.
- 複数 Workspace, Collection のサポート - Catalyst Plugin として実装
パッチ,アドバイス,励ましは大歓迎です.
■ ソースコード
ソースコードは AtomPP.tar.gz にあります.