by Hippo2000(2001/5/23)
SOAP::Transport::HTTPのPODなのです。
なおこのドキュメントはCPAN-Searchで出てきたドキュメント(PODを変換したもの)を日本語に訳そうとしたものです。わかりにくい部分は本物を見てください。(^^;;
原本の著作権はPaul Kulchenko さんがお持ちです。
Paul Kulchenko さんにはメールで了解をいただきました。なお内容等が間違っていたら修正します。ご連絡ください。
SOAP::Transport::HTTP - SOAP::Liteのためのサーバ/クライアント側HTTPサポート
use SOAP::Lite
uri => 'http://my.own.site.com/My/Examples',
proxy => 'http://localhost/',
# proxy => 'http://localhost/cgi-bin/soap.cgi', # ローカルなCGIサーバー
# proxy => 'http://localhost/', # ローカルなデーモン・サーバー
# proxy => 'http://localhost/soap', # ローカルな mod_perl サーバー
# proxy => 'https://localhost/soap', # ローカルな mod_perl セキュアサーバー
# proxy => 'http://login:password@localhost/cgi-bin/soap.cgi', # ローカルな認証付のCGIサーバー
;
print getStateName(1);
CGI server
use SOAP::Transport::HTTP;
SOAP::Transport::HTTP::CGI
# My/Examples.pmへのパスをここで指定
-> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method')
-> handle
;
Daemon server
use SOAP::Transport::HTTP;
# soapmark.plでテストしたければ、LocalPortを81に変更
my $daemon = SOAP::Transport::HTTP::Daemon
-> new (LocalAddr => 'localhost', LocalPort => 80)
# specify list of objects-by-reference here
-> objects_by_reference(qw(My::PersistentIterator My::SessionIterator My::Chat))
# specify path to My/Examples.pm here
-> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method')
;
print "Contact to SOAP server at ", $daemon->url, "\n";
$daemon->handle;
Apache mod_perl サーバー
SetHandler perl-script PerlHandler Apache::SOAP PerlSetVar dispatch_to "/Your/Path/To/Deployed/Modules, Module::Name, Module::method" PerlSetVar options "compress_threshold => 10000"
このクラスはSOAPサーバーのための、それが置かれたWebサーバーがなんであるかから独立したすべてのHTTP関連のロジックをカプセル化します。もしこのクラスを使いたければ、上記の簡単なガイドラインに従わなければなりません。
以下のメソッドが利用できます:
SOAPAction, method_uri and method_name.
SOAPAction はHTTPヘッダかた取得され、method_uri
と method_name はリクエストの本体から取り出されます。デフォルトの動きは、もしあればSOAPActionにマッチし、なければ無視されます。例えば以下のようにしてSOAPActionがマッチしなければdieするといったように、独自のものを指定することができます:
$server->on_action(sub {
(my $action = shift) =~ s/^("?)(.+)\1$/$2/;
die "SOAPAction shall match 'uri#method'\n" if $action ne join '#', @_;
});
dispatch_to(
'PATH/', # 動的: そこからすべてをロードします。すべてのモジュール、すべてのメソッド
'MODULE', # 静的: すべてのメソッドがこのモジュールから
'MODULE::method', # 静的: 指定されたメソッドをこのモジュールから
'method', # 静的: 指定されたメソッドをmain::から
);
もし指定するとパス(PATH)/モジュール名/クラスはパス・コンポーネントとしてuriから取得され、''/'を::'に置換されPerlモジュール名に変換されます。例えば:
urn:My/Examples => My::Examples urn://localhost/My/Examples => My::Examples http://localhost/My/Examples => My::Examples
一貫性を保つため、パスの先頭の'/'は無視されます。
新しいクラスを展開するためのこのスキームにしたがって、指定されたディレクトリの1つのこのクラスを置かなければなりません。そしてそのサービスを楽しんでください。簡単でしょ?
LWP::Agentモジュールで使うプロキシー設定のすべてを使うことができます:
SOAP::Lite->proxy('http://endpoint.server/',
proxy => ['http' => 'http://my.proxy.server']);
または
$soap->transport->proxy('http' => 'http://my.proxy.server');
はプロキシー・サーバーを設定します。そしてプロキシー認証のためにHTTP_proxy_userとHTTP_proxy_passを使えば、SOAP::Liteはそれを適切に扱う方法をしっているはずです。
use HTTP::Cookies;
my $cookies = HTTP::Cookies->new(ignore_discard => 1);
# セッションをまたがって保ちたければ'file'を追加することもできます。
my $soap = SOAP::Lite->proxy('http://localhost/');
$soap->transport->cookie_jar($cookies);
クッキーはレスポンスから取得され、リクエストに提供されます。HTTP::Cookieインターフェースで常に他のクッキーを追加(もしくはレスポンスの後に必要なことを取り出したり)することができます。
これを以下の1行ですることもできます:
$soap->proxy('http://localhost/',
cookie_jar => HTTP::Cookies->new(ignore_discard => 1));
SOAP::Liteは回線上(HTTP転送のみ)での圧縮を可能とするオプションを提供しています。サーバーとクライアントの双方でこの機能をサポートしていなければなりません、しかしロジックはアプリーケーションにとってまったく透過的です。もしクライアントがそれを受信することができ(クライアントは'deflate'または'*'の値でAccept-Encodingを送信します)、クライアントがフォールバック・ロジックを持っていれば、サーバーはエンコードされたメッセージだけで返答します。そのためサーバーが指定されたエンコーディング(Content-Encoding: deflate)を理解できず、適切なエラーコード(415 NOT ACCEPTABLE)を返せば、クライアントはエンコードされていない同じリクエストを繰り返し、このサーバーをセッションごとのキャッシュに格納します。そのためそこへの他のすべてのリクエストはエンコードなしにおこなわれます。
クライアント側とサーバー側で、圧縮のための閾値を設定させるオプションを有効すると、クライアントとサーバー側の両方で安全にこの機能を有効にすることができます。
print SOAP::Lite
-> uri('http://localhost/My/Parameters')
-> proxy('http://localhost/', options => {compress_threshold => 10000})
-> echo(1 x 10000)
-> result
;
サーバー
my $server = SOAP::Transport::HTTP::CGI
-> dispatch_to('My::Parameters')
-> options({compress_threshold => 10000})
-> handle;
圧縮はクライアント側で有効になります。もし:閾値が設定され、かつ現在のメッセージの大きさが閾値より大きく、かつモジュールCompress::Zlibが利用可能であれば。クライアントはもし閾値が指定され、かつompress::Zlibが利用可能であれば、値'deflate'を持ったヘッダ''Accept-Encoding' を送信します。
サーバーはCompress::Zlibが利用可能であれば、圧縮されたメッセージを受け取ります。そして以下の場合にのみ圧縮されたメッセージで応答します:閾値がしていされ、かつ現在のメッセージの大きさが閾値よりも大きく、かつモジュールCompress::Zlibが利用可能で、リクエストにヘッダ'Accept-Encoding'があれば。
SOAPサーバーの以下の例について考えてみてください:
use SOAP::Transport::HTTP;
SOAP::Transport::HTTP::CGI
-> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method')
-> handle
;
デーモン:
use SOAP::Transport::HTTP;
my $daemon = SOAP::Transport::HTTP::Daemon
-> new (LocalAddr => 'localhost', LocalPort => 80)
-> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method')
;
print "Contact to SOAP server at ", $daemon->url, "\n";
$daemon->handle;
mod_perl:
<Location /soap>
SetHandler perl-script
PerlHandler SOAP::Apache
</Location>
Apache.pm:
package SOAP::Apache;
use SOAP::Transport::HTTP;
my $server = SOAP::Transport::HTTP::Apache
-> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method');
sub handler { $server->handler(@_) }
1;
Alias /mod_perl/ "/Apache/mod_perl/"
<Location /mod_perl>
SetHandler perl-script
PerlHandler Apache::Registry
PerlSendHeader On
Options +ExecCGI
</Location>
soap.mod_cgi (put it in /Apache/mod_perl/ directory mentioned above)
use SOAP::Transport::HTTP;
SOAP::Transport::HTTP::CGI
-> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method')
-> handle
;
警告: Apache::Registryでの動的な展開はは失敗します。というのも動的にロードされるのは最初のときだけだからです。その後、それはメモリ上にあります。それは動的な展開を迂回し、アクセスが拒否されたことについてのエラーを生成します。dispatch_to()でPATH/とMODULE名の両方を指定してください。するとモジュールは動的にロードされ、静的な展開と同じように機能します。例としてexamples/server/soap.mod_cgiをご覧ください。
Can't load '/usr/local/lib/perl5/site_perl/.../XML/Parser/Expat/Expat.so' for module XML::Parser::Expat: dynamic linker: /usr/local/bin/perl: libexpat.so.0 is NEEDED, but object does not exist at /usr/local/lib/perl5/.../DynaLoader.pm line 200.
そしてApacheウェブ・サーバーを使っていれば、httpd.confに以下のものを追加してみてください。
<IfModule mod_env.c>
PassEnv LD_LIBRARY_PATH
</IfModule>
RULE_EXPAT=no
詳細についてはhttp://archive.covalent.net/modperl/2000/04/0185.xml をご覧になってください。この通信上の動きについて説明してくれたRobert Barta (rho@bigpond.net.au) にとても感謝します。
Crypt::SSLeay HTTPS/SSLのため SOAP::Lite, URI SOAP::Transport::HTTP::Serverのため LWP::UserAgent, URI SOAP::Transport::HTTP::Clientのため HTTP::Daemon SOAP::Transport::HTTP::Daemonのため Apache, Apache::Constants SOAP::Transport::HTTP::Apacheのため
実装の詳細については ::CGI, ::Daemon and ::Apache をご覧ください。 SOAP::Transport::HTTP::CGI 例は examples/server/soap.cgi をご覧ください。 SOAP::Transport::HTTP::Daemon の例は examples/server/soap.daemon をご覧ください。 SOAP::Transport::HTTP::Apache の例は examples/My/Apache.pm をご覧ください。
(原文のまま)
Copyright (C) 2000-2001 Paul Kulchenko. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
(原文のまま)
Paul Kulchenko (paulclinger@yahoo.com)
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。