Perl・PHPで手軽にウェブサービスを呼べるライブラリを自動生成(WSST)

WSST というプロジェクトを3月末にひっそりと公開しました。
メインのコミッタは mitsuhisa さん。(参加者募集中です)
WSST とは、YAML でウェブサービスのインターフェース定義を書くと、
Perl・PHP のライブラリを自動生成してくれるツールです。
WSST を利用して作成した Perl・PHP ライブラリのリリースについては、
MTL ブログ に書いたのだけど、WSST 自体についてはまだ詳しく
書いていなかったので、改めて紹介します。


(画像は OSDC.TW 2008(台北)の資料を更新)

WSS (WebService Specification Schema) は、YAML ベースのスキーマ言語。
POX なウェブサービスの呼び出し URL、引数となるリクエストのパラメタ名や、
レスポンスの XML 要素名などを YAML 形式で定義していきます。
その WSS を使って Perl モジュールや PHP ライブラリを自動生成するのが
WSST (WebService Specification Schema Tool) です。

たとえば、flickr の flickr.test.echo メソッドに対応した WSS は↓のようになります。
company_name: Flickr
service_name: Test
version: 0.0.1
methods:
  - name: echo
    title: flickr.test.echo
    url: http://api.flickr.com/services/rest/
    params:
      - name: method
        require: true
        fixed: flickr.test.echo
      - name: api_key
        require: true
この YAML から Perl 版なら WebService::Flickr::Test モジュールが生成されるので、
use WebService::Flickr::Test;
my $service = WebService::Flickr::Test->new();
my $param = {
    api_key => $ENV{FLICKR_API_KEY},
    foo => 'bar',
};
my $res = $service->echo( %$param );
my $root = $res->root();
print "foo: ", $root->foo(), "\n"; // => bar
のように利用できるようになります。
Web サービスを使うのに、XML や HTTP に関する知識は不要です。
PHP 版なら Services_Flickr_Test ライブラリが生成されます。

実際には、YAML 定義ファイルは上記よりもう少し長くて、flickr-test-0.0.1.yml のようになります。
API 呼び出しエラー時の XML の定義や、テスト項目を書けるのもポイント。
この YAML ファイルを1回だけ書けば、Perl・PHP の両言語に対応できる。
テストや ドキュメント も WSST が自動生成してくれます。

ダウンロードと、ライブラリ生成を試してみる手順:
$ svn checkout http://wsst.googlecode.com/svn/trunk/
$ cd trunk/example/flickr-test
$ ls flickr-test-0.0.1.yml
flickr-test-0.0.1.yml
$ mkdir ./temp
$ ../../wsst/bin/wsst -v generate -s flickr-test-0.0.1.yml -o ./temp
[WSST::BuiltinGenerator#perl]
./temp/perl/make-dist.sh
./temp/perl/README
./temp/perl/Makefile.PL
./temp/perl/t/01_new.t
./temp/perl/t/02_new_methods.t
./temp/perl/t/03_setget.t
./temp/perl/t/04_Method_Echo.t
./temp/perl/t/05_Method_Login.t
./temp/perl/lib/WebService/Flickr/Test.pm
./temp/perl/lib/WebService/Flickr/Test/Base.pm
./temp/perl/lib/WebService/Flickr/Test/Echo.pm
./temp/perl/lib/WebService/Flickr/Test/Login.pm
./temp/perl/t/06_Test.t
./temp/perl/t/00_pod.t

[WSST::BuiltinGenerator#php]
./temp/php/Test.php
./temp/php/docs/examples/echo.php
./temp/php/docs/examples/login.php
./temp/php/tests/AllTests.php
./temp/php/tests/Services/Flickr/TestTest.php
./temp/php/tests/Services/Flickr/Test/RequestTest.php
./temp/php/tests/Services/Flickr/Test/ResponseTest.php
./temp/php/tests/Services/Flickr/Test/FactoryTest.php
./temp/php/tests/Services/Flickr/Test/Response/DefaultTest.php
./temp/php/tests/Services/Flickr/Test/Method/EchoTest.php
./temp/php/tests/Services/Flickr/Test/Method/LoginTest.php
./temp/php/tests/Services/Flickr/Test/Request/DefaultTest.php
./temp/php/Test/Request.php
./temp/php/Test/Response.php
./temp/php/Test/Method.php
./temp/php/Test/Factory.php
./temp/php/Test/Response/Default.php
./temp/php/Test/Method/Echo.php
./temp/php/Test/Method/Login.php
./temp/php/Test/Request/Default.php
./temp/php/package.xml
ライブラリは、Perl・PHP 言語それぞれのテンプレートファイルから
ざっくり 2秒 くらいで生成されます。

Perl モジュールのテストを実行してみる手順:
$ cd ./temp/perl
$ export FLICKR_API_KEY=9bfbxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ perl Makefile.PL && make test
Writing Makefile for WebService::Flickr::Test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00_pod...............ok
t/01_new...............ok
t/02_new_methods.......ok
t/03_setget............ok
t/04_Method_Echo.......ok
t/05_Method_Login......skipped: set FLICKR_API_SIG, FLICKR_AUTH_TOKEN env to test this
t/06_Test..............skipped: set FLICKR_API_SIG, FLICKR_AUTH_TOKEN env to test this
All tests successful.
Files=7, Tests=41, 1 wallclock secs ( 0.00 usr 0.04 sys + 0.18 cusr 0.12 csys = 0.34 CPU)
Result: PASS
まずはリクルートの 9 種のウェブサービス 用の WSS ファイルを作成して、
生成した Perl 用モジュールについては CPAN にて公開しています。
WebService::Recruit::AbRoad
WebService::Recruit::Aikento
WebService::Recruit::Akasugu
WebService::Recruit::AkasuguUchiiwai
WebService::Recruit::CarSensor
WebService::Recruit::Eyeco
WebService::Recruit::FromA
WebService::Recruit::HotPepperBeauty
WebService::Recruit::Shingaku
もちろん、flickr を含む多くの POX なウェブサービスで利用可能です。
その他のウェブサービスに対応した WSS の登場も期待しています!

また、Perl・PHP 以外の言語に対応させるテンプレート作成も次の課題。
もともと WSST は、昨年 WebService::Recruit::Jalan 等のモジュールをリリースする際に
共通部分を依存モジュールとして切り出した XML::OverHTTP を利用して、
さらに多言語対応して汎用化できないか、検討を続けていたもの。
Perl 版・PHP 版と同様に、各言語ごとのテンプレートを作成していくことで、
ActionScript・Ruby・Python などの言語にも対応できる。

あるいはプログラミング言語だけでなく、HTML や PDF を出力すれば
誤字のない Web サービスの仕様書やマニュアルページまで作れる。
また、WSS から WADL を出力したり、反対に WADL から WSS の
元となるファイルを逆生成する仕組みを作れそうです。


Yappo さんの WebService::Simple::Cabinet も、実現していることは近いですね。
ウェブサービスのインターフェースを Perl オブジェクト(または YAML)で定義できる。
WSS から、この WebService::Simple::Cabinet 用の YAML 生成もできそう。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 9

なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた
面白い 面白い
ナイス
ガッツ(がんばれ!)
かわいい

この記事へのコメント

この記事へのトラックバック