Hippo2000 (2000/7/19)
SOAP::EnvelopeMaker - SOAP envelope の作成
use SOAP::EnvelopeMaker;
my $soap_request = ''; my $output_fcn
= sub { $soap_request .= shift; }; my $em
= SOAP::EnvelopeMaker->new($output_fcn);
my $body = { origin => { x => 10, y =>
20 }, corner => { x => 100, y => 200 }, };
$em->set_body(``urn:com-develop-geometry'', ``calculateArea'', 0, $body);
my $endpoint = ``http://soapl.develop.com/soap?class=Geometry'';
my $method_uri = ``urn:com-develop-geometry''; my $method_name
= ``calculateArea'';
use SOAP::Transport::HTTP::Client;
my $soap_on_http = SOAP::Transport::HTTP::Client->new();
my $soap_response = $soap_on_http->send_receive($endpoint,
$method_uri, $method_name, $soap_request); use SOAP::Parser; my $soap_parser
= SOAP::Parser->new(); $soap_parser->parsestring($soap_response);
my $area = $soap_parser->get_body()->{area};
print ``The area is: $area\n'';
SOAP::EnvelopeMaker の全体の使用パターンは以下のようになります:
1) SOAPパケットをによって何をしたいのかを決め、この方針を実装する出力関数を作成します。
2) SOAP::EnvelopeMakerのインスタンスを生成しますし、あなたの出力関数へのリファレンスを渡します。
(最初の2つステップをあなたの代わりに、だれがか既にやっていて、そして単に初期化されているEnvelopeMakerへのリファレンスを渡すかもしれません−例としてSOAP::Transport::HTTP::Serverをご覧ください)
3) (オプション)ヘッダを指定するためにadd_headerを呼び出します。
4) (必須)ボディを指定するためにset_bodyを呼び出します。
5) EnvelopeMakerを放り投げます。そして出力関数を通して集めたエンベロープ(envelope)で何かします。(指定されたどこかに出力単純にパイプするのではないと仮定しています)
EnvelopeMaker はbodyを設定する*前に*、*全ての*headerを追加することを期待します−これを間違えると、結果は不定です。
set_bodyが返ると、完全なSOAPエンベロープは出力関数に送信されるでしょう(1つもしくは複数のチャンクで)。あなたはできます
OutputFcnは1つのスカラ・パラメータを受け取らなければなりません。そしてそれが構築されるとSOAPエンベロープのチャンクで複数回呼ばれます。完全なエンベロープが構築されるまで待ちながら、それに(例えばcontent-lengthを計算するような)何かをする前に、これらのチャンクを1つの大きな文字列につなげたり、単にそれぞれのチャンクを直接どこかほかにパイプすることができます。
最初の2つのパラメータはヘッダにQName(修飾された名前=qualified name)を指定することを可能にします。SOAPでは全てのヘッダは名前空間で修飾されなければならないことに注意してください。MustUnderstandとIsPackageはSOAP仕様で説明されているSOAP機能を有効にします;もしまだSOAPパッケージをgrok'dしていなければ、lsPackageに0を渡してください。最後にObjectは、なんらかヘッダにシリアライズしたいものです。(何が指定できるかについての注意はset_bodyをご覧ください;ヘッダはボディと同じ内容を持つことができます)
最初の2つのパラメータはボディにQName(修飾された名前=qualified name)を指定することを可能にします。Accessorの名前は、あなたが作ったSOAPメソッドの名前です。lsPackageはボディがSOAPパッケージになることを言います;これが何を意味するのか分からなければ単に0を渡してください。Objectはシリアライズしたいなんらかのものです。いかのものが指定できます:
1) スカラ - ボディにはスカラの内容が入ります。
2) ハッシュ・リファレンス - ボディにはハッシュの内容のSOAPシリアル化されたものが入ります。
SOAP/Perl シリアライゼーション・アーキテクチャは非常に注意深くリファレンスを扱うこと、そのため任意のオブジェクト・グラフを渡すことができることに注意してください。("オブジェクト・リファレンス"は現在はblessされないスカラまたはハッシュ・リファレンスでなければならないとしても)
将来は、blessされたオブジェクト・リファレンスを渡すことが期待されます(もしそれを今日したいのであれば、実験的なSOAP::TypeMapperをご覧ください)
興味深いことの1つとして、SOAP(そしてSOAP/Perl)はヘッダとボディがリファレンスを共有できることをサポートします。これらは同じ内容を示すことができます。また循環の検知(cycle detection)はSOAP/Perlのシリアライズ・アーキテクチャの自然な部分で、そのためリンクされたリスト、循環する行列(circular queue)などを渡すことができます。それらは正しく元に戻ります。
SOAP::Envelope
Keith Brown
SOAP::Envelope
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。