ブログ  前の記事  次の記事  2007-07-26 

たけまる / 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 にあります.

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→