暇なのでソープのお勉強。と、カタカナで書くとなんですが、SOAPね。いかがわしいのじゃなくて。
Perl の SOAP::Lite (mod_perl + Apache::SOAP) で実験してみる。 何の機能を提供しようか、と考えてみるが、大したサービスができるわけでなし。 酒日記のトップページ の最終更新日を返す、というクソの役にも立たないものを作ってみる。まあとりあえず実験なので。
...
サーバ側の .htaccess を、
<FilesMatch "\.soap"> SetHandler perl-script PerlHandler Apache::SOAP PerlSetVar dispatch_to "/home/httpd/html/soap/lib, SakeSOAP" PerlSetVar options "compress_threshold => 10000" </FilesMatch>
とする。これで、クライアントから
end point URL : http://sake-nikki.dyndns.org/soap/index.soap name space URI : urn:SakeSOAP
で接続すると、SakeSOAP.pm が叩ける(はず)。
SakeSOAP.pm は以下のような感じで。何の変哲もない、普通の Perl のモジュール。
package SakeSOAP; use strict; use HTTP::Date qw(time2iso); use vars qw/ $VERSION /; use constant SAKENIKKI_TOP => '/home/httpd/html/sake/index.html'; use constant LAST_UPDATED_TYPE_UNIX => 'unix'; use constant LAST_UPDATED_TYPE_ISO => 'iso'; $VERSION = '0.01'; sub new { my $class = shift; my $self = bless {}, $class; $self; } sub getSakeNikkiLastUpdated { my $self = shift; my $type = shift; my @stats = stat SAKENIKKI_TOP; if($stats[9]){ if($type eq LAST_UPDATED_TYPE_UNIX){ return $stats[9]; }elsif($type eq LAST_UPDATED_TYPE_ISO){ return time2iso($stats[9]); }else{ return $stats[9]; } }else{ return undef; } } 1;
クライアントは、SOAP::Lite を使って以下のように。
use SOAP::Lite; my $soap = SOAP::Lite ->uri('urn:SakeSOAP') ->proxy('http://sake-nikki.dyndns.org/soap/index.soap') ->new; print $soap->getSakeNikkiLastUpdated('iso')->result, "\n";
getSakeNikkiLastUpdated の引数に "iso" を渡すと ISO 形式の文字列、"unix" を渡すと、UNIX time が返ります。
で、実行。
$ perl soap.pl 2002-05-29 05:00:20
... 地味だ。地味すぎる。が、まあ、一応このやりとりの裏ではメッセージが XML で行ったり来たりしているわけですよ。
クライアントもサーバも SOAP::Lite で実装しているので、うまくいくのはある意味あたり前。
クライアントを Java など他の実装で作って、それで叩いてみる必要もあるなあ。
# Java も勉強しないと・・・