Hippo2000 (2000/7/19)
SOAP::OutputStream - SOAPフラグメントの出力
# 開始(bootstrap)するのにSOAP::Envelopeが必要なことに注意
use SOAP::Envelope;
sub output_fcn {
my $string = shift;
print $string;
}
my $namespaces_to_preload = ["urn:foo", "urn:bar"];
my $env = SOAP::Envelope->new(\&output_fcn,
$namespaces_to_preload);
my $body = $env->body();
# ここで実際にSOAP::OutputStreamを使います
my $child = $body->compound_accessor("urn:quux", "reverse_string", undef, undef, 0);
$child->simple_accessor(undef, "s", undef, undef, "dlrow olleH");
$child->term();
$body->term();
$env->term();
これは以下のXMLを生成します:
<s:Envelope xmlns:s=``urn:schemas-xmlsoap-org:soap.v1'' xmlns:xsi=``http://www.w3.org/1999/XMLSchema'' xmlns:n1=``urn:foo'' xmlns:n2=``urn:bar''> <s:Body> <n3:reverse_string xmlns:n3=``urn:quux''> <s>dlrow olleH</s> </n3:reverse_string> </s:Body> </s:Envelope>
SOAP::OutputStreamはSOAPパケットの出力の詳細を2,3の使いやすい関数にカプセル化します。SOAPストリームを開始(bootstrap)する(そして最初のSOAP::OutputStream リファレンスを取得する)ために、上記の例のようにSOAP::Envelopeを使う必要があります。
この関数は簡単なアクセサ(例えば複合型ではなく文字列や数字)を書きます。これは2組のURI/typenameをとります。1つはアクセサのため、そしてもう1つはオプションのxsd:type属性のためです。最低限accessor_nameと内容は指定しなければなりません。
この関数は新しい複合アクセサを開きます(開いたXMLタグを書くことによって)、そしてそのアクセサの内容を書き出すために使う新しいSOAP::OutputStreamを返します。この関数は常にネストした要素を作成します。独立した要素を作成したければ、代りにreference_accessorを呼んでください。is_packageパラメータはこのノードに新しいパッケージを開くことを可能にします;OutputStreamは、独立したXMLフラグメントをSOAPエンベロープに作成しながら、XMLドキュメントにすべてのさらなる独立した要素を書き出します。OutputStreamはこのノードが閉じたときパッケージないのすべてのリファレンスが解決できなければ、文句を言います。パッケージの詳細についてはSOAP仕様をご覧下さい。
この関数はリファレンス(SOAP::href)ノードを作成し、指定されたオブジェクトを現在のパッケージが閉じられるまで保管します。そのとき(その型をベースにして)そのオブジェクトのためのシリアライザが取得され、そしてそのパッケージのレベルで新しいストリームにそれ自身をシリアル化するように頼まれます。
このパッケージを明示的に使うのでなければ、ヘッダの作成からボディの作成に移るとき、そしてボディが終了するときにシステムはこの解決とシリアル化を行います。
参照されるオブジェクトは一度だけシリアライズされることが保証されます。(あなたがパッケージとヘッダ/ボディ・オブジェクト参照共有のルールにSOAPルールに従うものと考えています)
作業しているノードを閉じたいときにこの関数を呼び出してください。これは多くのことを行います - 使用しているノードがパッケージとして作られたのならば、そのパッケージを封印します、そして終了タグを書き出します(これはとても重要なのですがいくつかの内部の家事的なことも行います)。新しい子孫のノードを開く前に、この関数を呼ぶのを忘れないで下さい。
SOAP::Defs
Keith Brown
SOAP::Envelope
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。