◆早期解決で 1500point差し上げます!


PerlでのSOAP送信について教えてください。下記①はWSDLの抜粋コードです

名前aFという所にacTで指定されているように、
2つの値を送信する必要があるのですが、
WSDLで配列を処理するコードが書かれていない為、送信方法がわかりません

$array = SOAP::Data->type(array => ['string','string']);
これだと配列を投げてしまう為、SOAP Faultが返されます。

sIAの名前属性で飛ばされる先のsIATは配列処理がされているため、
わざとこのaFのみ、配列処理がされてないようです。

この場合、どうやって処理したら宜しいでしょうか。

print SOAP::Lite->service($wsdl)->submit(●,'sI値','sIA値');

--WSDL抜粋
<xsd:complexType name=sRT>
<xsd:sequence>
<xsd:element name=aF type=tns:acT />
<xsd:element name=sI type=xsd:string />
<xsd:element name=sIA type=tns:sIAT />
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name=acT>
<xsd:sequence>
<xsd:element name=bI type=xsd:string />
<xsd:element name=tI type=xsd:string />
</xsd:sequence>
</xsd:complexType>

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/03/19 15:04:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:shintabo No.2

回答回数45ベストアンサー獲得回数10

ポイント5000pt

# service は、あまり使ったことないのですが、、、

SOAP::Lite->service(WSDL)->submit(

SOAP::Data->value([

SOAP::Data->name('bl')->value(1234),

SOAP::Data->name('tl')->value(2345),

]),

'sl値',

'slA値'

);

# で、どーですか??

# ちなみに、SOAP::Lite の WSDL 読み込みは、「.」が入った operation がエラーになったはずなので

SOAP::Lite->new()->('submit', xxxxxx);

# で、やってみてはいかがでしょうか?

id:furure

丁寧な回答ありがとうございます!

ただ、教えて頂いたものだと、[ ]でくくるため、配列になりませんか?

サービス先は技術的な回答はしてくれないのですが、(SOAP::Liteについては詳細不明とのこと)

送信方法がわかっていない部分のSOAP送信サンプルをもらえました。

<aF xsi:type="ns1:acT">

<bI xsi:type="xsd:string">sample req</bI>

<tI xsi:type="xsd:string">sample req</tI>

</aF>

aFの中にbIとtIを置いて、aFではtype としてacTを指定しないといけないようです。。

※サービスからの回答でaFは配列ではないことも念を押されました。

ポイント数アップしますのでお忙しいところ申し訳ございませんが、

ご協力お願いできますでしょうか。。

2010/03/17 10:31:23

その他の回答1件)

id:fuma10131 No.1

回答回数10ベストアンサー獲得回数0

ゴミ箱に捨てる

id:shintabo No.2

回答回数45ベストアンサー獲得回数10ここでベストアンサー

ポイント5000pt

# service は、あまり使ったことないのですが、、、

SOAP::Lite->service(WSDL)->submit(

SOAP::Data->value([

SOAP::Data->name('bl')->value(1234),

SOAP::Data->name('tl')->value(2345),

]),

'sl値',

'slA値'

);

# で、どーですか??

# ちなみに、SOAP::Lite の WSDL 読み込みは、「.」が入った operation がエラーになったはずなので

SOAP::Lite->new()->('submit', xxxxxx);

# で、やってみてはいかがでしょうか?

id:furure

丁寧な回答ありがとうございます!

ただ、教えて頂いたものだと、[ ]でくくるため、配列になりませんか?

サービス先は技術的な回答はしてくれないのですが、(SOAP::Liteについては詳細不明とのこと)

送信方法がわかっていない部分のSOAP送信サンプルをもらえました。

<aF xsi:type="ns1:acT">

<bI xsi:type="xsd:string">sample req</bI>

<tI xsi:type="xsd:string">sample req</tI>

</aF>

aFの中にbIとtIを置いて、aFではtype としてacTを指定しないといけないようです。。

※サービスからの回答でaFは配列ではないことも念を押されました。

ポイント数アップしますのでお忙しいところ申し訳ございませんが、

ご協力お願いできますでしょうか。。

2010/03/17 10:31:23
  • id:shintabo
    ごめんなさい、時間がとれなくて、みれてませんでした。。。

    内容理解しました。

    ざっと確認しただけなので、コメントに書いておきます。

    SOAP::Data を確認したところ、

    SOAP::Data->name('foo' => \SOAP::Data->value(
    SOAP::Data->name('bar' => '123')));

    より、

    <foo>
    <bar>123</bar>
    </foo>

    が生成できるようなので、

    SOAP::Data->new('aF' => ¥SOAP::Data->value(
    SOAP::Data->name('tl' => '123', 'bl' => '234')));

    で、どうでしょうか?
  • id:furure
    度々の回答本当にありがとうございます。
    本日は出先のため試せないのですが
    明日必ず試してまた結果報告します。
    ありがとうございます。
  • id:shintabo
    簡単なWSDLと、プログラムを書いておきますね

    <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:s="http://www.w3.org/2001/XMLSchema"
    xmlns:s0="urn:HelloWorld"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:HelloWorld"
    xmlns="http://schemas.xmlsoap.org/wsdl/">

    <types>
    <s:schema targetNamespace="urn:HelloWorld">
    <complexType name="acT">
    <sequence>
    <element name="bI" type="s:string" />
    <element name="tI" type="s:string" />
    </sequence>
    </complexType>
    </s:schema>
    </types>

    <message name="sayHello">
    <element name="aF" type="s0:acT" />
    </message>

    <message name="sayHelloResponse">
    <part name="sayHelloResult" type="s:string" />
    </message>

    <portType name="Service1Soap">
    <operation name="sayHello">
    <input message="s0:sayHello" />
    <output message="s0:sayHelloResponse" />
    </operation>
    </portType>

    <binding name="Service1Soap" type="s0:Service1Soap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
    style="rpc" />
    <operation name="sayHello">
    <soap:operation soapAction="urn:HelloWorld#sayHello"/>
    <input>
    <soap:body use="encoded"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </input>
    <output>
    <soap:body use="encoded"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </output>
    </operation>
    </binding>

    <service name="HelloWorld">
    <port name="HelloWorldSoap" binding="s0:Service1Soap">
    <soap:address location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
    </port>
    </service>
    </definitions>



    #!/usr/bin/perl

    use strict;
    use warnings;
    # use SOAP::Lite;
    use SOAP::Lite +trace => 'debug';

    my $soap = SOAP::Lite->service("file:say_hello_rpcenc.wsdl");
    my $af = SOAP::Data->type('ns1:acT')->name('aF' =>
    \SOAP::Data->value(
    SOAP::Data->value(SOAP::Data->name('bl' => 'sample bl')),
    SOAP::Data->value(SOAP::Data->name('tl' => 'sample tl'))));
    my $result = $soap->sayHello($af);
    print $soap->result();

    で、リクエストデータをみると

    <?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s0="urn:HelloWorld"><soap:Body><s0:sayHello><aF xsi:type="ns1:acT"><bl xsi:type="xsd:string">sample bl</bl><tl xsi:type="xsd:string">sample tl</tl></aF></s0:sayHello></soap:Body></soap:Envelope>

    となっているので、できているようです。
  • id:furure
    WSDL作成・テストリクエスト送信・その結果のご報告までやっていただき
    本当にありがとうございました。。
    これだけのものになると質問とかではなく、1案件レベルになってきて、
    大変申し訳ない気持ちと感謝の気持ちしかありません。。

    実はちょっと私事でごたごたがあり、21日にならないと実験環境で
    試せないことになってしまい、この質問がはじめてなので
    なんともいえないですが、21日にもコメントがかけるようでしたら
    報告させていただきたいとおもいます。

    一旦質問を閉めさせていただき、このあとポイント付与させていただきます。
    ポイント交換などしていただいて、なにか美味しいものでも召し上がってください。
    本当にありがとうございました!
  • id:shintabo
    ありゃー、すいません

    ポイントが多すぎて、、、こちらこそ恐縮です。

    perl好きなので、

    http://modperlis.bounceme.net/

    に、これ以外でも何かあれば、コメントいただければと思います。

    (全然更新してないので、ネタに使わせていただく可能性も高いですがw)

    では、うまくいくことを祈っています
  • id:furure
    お世話になってます!

    昨日はまだゴタゴタに巻き込まれていてできなかったのですが、
    今日やってみたところ無事リクエスト内容は希望通りの構造になりました!
    ありがとうございました!!

    ただ、、それ以外のところなのかなんなのかわからないのですが、
    相手サービスからエラーが吐かれていて解決せず、、
    今相手サービスに確認をとっているところです。。

    また、、なにかあったら、、是非お願いさせて下さい、、、。。

    それでは一旦、解決!ということで、本当にありがとうございました!m(_ _)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません