追記
ゆーすけべーさんのほうで、最終引数をパスではなくオプションハッシュにする対応を入れて頂きました。
これにより以下のパッチを当てなくても動的にメソッドパスを設定出来る様になりました。ゆーすけべーさんにはサンプルも変更に対応して頂き、さらにはパッケージに含んで頂いたようです。
yusukebe++
修正されたソースは
http://coderepos.org/share/browser/lang/perl/WebService-Simple/trunk/example/lingr.pl
より参照下さい。以下、パッチも一応残しておきますが当たりませんのでお気をつけ下さい。サンプルは入れ替えておきました。
便利だなぁ。
ゆーすけべー日記: POX over HTTP のウェブAPIにアクセスするためのモジュール「WebService::Simple」を作ってみた
俗に言う「POX over HTTP」のウェブAPIにアクセスするためのシンプルな(?)Perlモジュール「WebService::Simple」なるものを作ってみました。
ゆーすけべー日記: WebService::Simple でキャッシュできるようにしたよ
dannさんから「WebService::Simpleで(取得したコンテンツを)キャッシュしたいよ!」と言われて、俺もその機能欲しかったので追加しました。
flickrとか簡単に扱えてしかもキャッシュ機能もある。1セッション当たりにサーバへのアクセス数が多いサービスでは重宝するんじゃないかな。で、試そうかと思ったんですが、ベースURLが固定なRESTサービス(methodパラメータとか無い物)って案外無い。どっちかっていうと、URLにメソッドを含んでいる物が多い。そうした場合、メソッド単位でURLを変えなきゃいけない。って事でちょっとだけ改造してみました。
この変更は別の方法で取り込まれました。
Index: lib/WebService/Simple.pm
===================================================================
--- lib/WebService/Simple.pm (revision 8637)
+++ lib/WebService/Simple.pm (working copy)
@@ -3,9 +3,9 @@
use warnings;
use strict;
use Carp;
+use URI;
use URI::Escape;
use LWP::UserAgent;
-use URI::Escape;
use WebService::Simple::Response;
our $VERSION = '0.02';
@@ -21,8 +21,8 @@
}
sub get {
- my ($self, $request_param) = @_;
- my $url = $self->_make_url($request_param);
+ my ($self, $request_param, $path) = @_;
+ my $url = $self->_make_url($request_param, $path);
my $response = $self->_fetch_url($url);
return $response;
}
@@ -44,14 +44,21 @@
return $response;
}
sub _make_url{
- my ($self, $request_param) = @_;
+ my ($self, $request_param, $path) = @_;
my $base_url = $self->{base_url};
my $url = $base_url =~ /\?$/ ? $base_url : $base_url . "?";
my @params;
push(@params, $self->_hashref_to_str($self->{param}));
push(@params, $self->_hashref_to_str($request_param));
- my $str = join("&",@params);
- return $url . $str;
+ $url .= join("&",@params);
+ if ($path) {
+ # append additional path.
+ my $u = URI->new( $url );
+ $path =~ s!^/!! if $u->path =~ /\/$/;
+ $u->path( $u->path . $path );
+ $url = $u->as_string;
+ }
+ return $url;
}
sub _hashref_to_str {
やっているのは「get」メソッドのパラメータにoptionalな「path」パラメータを足しただけです。このpathパラメータはbase_urlに指定のパスを付け足します。例えば
http://example.com/rest?test=1
とういベースURLに対して
$api->get( {
value => 123,
}, '/api/foo/bar' );
とすれば
http://example.com/rest/api/foo/bar?test=1&value=123
というアクセスになる様な修正です。
ただ、引数の一番最後で良いのかどうかで悩んでcommitはしていません。
今日はこの改造後のWebService::Simpleを使って
Lingrに発言するスクリプトを作ってみました。(こんなにスマートになるよ!という意味で)
このサンプルは上記codereposにある物のコピーです。
use strict;
use warnings;
use WebService::Simple;
my $api_key = "your_api_key";
my $room_id = "hO4SmQWTdJ4";
my $nickname = "lingr.pl";
my $message = $ARGV[0] || "Hello, World.";
my $lingr = WebService::Simple->new(
base_url => 'http://www.lingr.com/',
param => { api_key => $api_key, format => 'xml' }
);
my $response;
$response = $lingr->get( {}, { path => '/api/session/create' } );
my $session = $response->parse_xml->{session};
$response = $lingr->get(
{
session => $session,
id => $room_id,
nickname => $nickname,
},
{ path => '/api/room/enter' }
);
my $ticket = $response->parse_xml->{ticket};
$response = $lingr->get(
{
session => $session,
ticket => $ticket,
message => $message,
},
{ path => '/api/room/say' }
);
my $status = $response->parse_xml->{status};
$lingr->get( { session => $session, }, { path => '/api/session/destroy' } );
base_urlが変る事で毎回WebService::Simpleを作らなくても良くなり、スッキリした感じです。
ゆーすけべーさんには、案だけ採用して貰いたい。(私の下手なコードは使わないで下さいという意味)