Hippo2000 (2000/7/19)
SOAP::Transport::HTTP::Apache - SOAP mod_perl ハンドラ
Apacheとmod_perlを使ったSOAPエンドポイントを公開するためにこのクラスを使います。ここにSOAPパケットを受取るようなクラスの例を示します。1つの面白い関数handle_requestを実装していることに注意してください。これは以下のような引数を取ります:ヘッダの配列、ボディ、レスポンスを作成するためのEnvelopeMaker:
package Calculator;
use strict;
sub new {
bless {}, shift;
}
sub handle_request {
my ($self, $headers, $body, $envelopeMaker) = @_;
$body->{extra_stuff} = "heres some extra stuff";
foreach my $header (@$headers) {
$header->{extra_stuff} = "heres some more extra stuff";
$envelopeMaker->add_header(undef, undef, 0, 0, $header);
}
$envelopeMaker->set_body(undef, 'myresponse', 0, $body);
}
1;
HTTPリクエストを上記のCalculatorクラスの呼び出しに変化するためには、Apacheハンドラを書く必要があります。ここでSOAP::Transport::HTTP::Apacheを使います:
package ServerDemo;
use strict;
use SOAP::Transport::HTTP::Apache;
sub handler {
my $safe_classes = {
Calculator => undef,
};
SOAP::Transport::HTTP::Apache->;handler($safe_classes);
}
1;
ご覧いただいたように、このクラスは行うことのすべては以下の通りです − HTTPヘッダを解析し、リクエストを読みこみ、レスポンスを送ります。あなたがするべきことはクラスの名前をしていすることだけdす。それは安全(safe)に起動されます。
もちろんあなたの上記のハンドルクラスについてApacheに知らせるために、httpd.confを変更する必要があります:上記のServerDemoハンドラにマッピングする"/soap"というエンドポイントの設定方法を示す以下に簡単な例を示します:
<Location /soap>
SetHandler perl-script
PerlHandler ServerDemo
</Location>
(私はPerlの@INCパスにServerDemoにあるかを確かめることについては放ってあります− オライリーのWriting Apache Modules with Perl and C(=PerlとCによるApacheモジュールの書き方)をヘルプとして見てください、あるいは単に man mod_perlしてください)
このクラスはmod_perlへのフックとそしてSOAP特有の作業をさせるためにSOAP::Transport::HTTP::Serverを呼び出す詳細をカプセル化しています。こうしてServerクラスは、単純に異なるフロント−エンド(例えばSOAP::Transport::HTTP::CGI)を組みたてることにより、(CGIを含めて)どのようなWebサーバ設定でも再利用することができます。
これがこのクラスでの唯一のメソッドです。そしてエンドポイントで呼ばれるであろうクラスの集まりがキーに入ったハッシュ・リファレンスを渡さなければなりません。例えばこのリストでクラスFooBarを指定し、クライアントがSOAPリクエストhttp://yourserver/soap?class=FooBar, を送信したら、SOAP::Transport::HTTP::Serverクラスは最終的にFooBar.pmをロードし、FooBarのインスタンスを作成し、そのhandle_request関数を呼び出そうとします。(詳細はSOAP::Transport::HTTP::Serverをご覧下さい)。このハッシュにクラスを入れなければ、SOAP/Perl はそれを実行しません。これは保証します。
ところでこのハッシュではキーだけが重要です、値は無視されます。
同時に、もし幾つかのヘッダを追加したかったり何かしたければ、リクエスト・オブジェクトをいじくりまわすを止めるものはありません。あなたは常にhandle_request関数の中からリクエスト・オブジェクトを取得するためにApache->request()を呼び出すことができます。その時点でレスポンスがマーシャル化され、送信されるので、 SOAP::Transport::HTTP::Serverに戻す前にやっていることを確実に終わらせてください。
OptionalDispatcher 引数の説明についてはSOAP::Transport::HTTP::Serverをご覧下さい。
SOAP::Transport::HTTP::Server
Keith Brown
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。