2

Web サービスへの SOAP 呼び出しを行うのに苦労しています。WSDL は次のようになります。

<wsdl:definitions name="Service" targetNamespace="/Service/">
    <wsdl:types>
        <xsd:schema targetNamespace="/#/">
        <xsd:element name="authToken">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="username" type="xsd:string"/>
                    <xsd:element name="password" type="xsd:string"/>
                </xsd:sequence>
           </xsd:complexType>
        </xsd:element>
        <xsd:element name="fault">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="faultType">
                        <xsd:simpleType>
                            <xsd:restriction base="xsd:string">
                                <xsd:enumeration value="REQUIRED"/>
                                <xsd:enumeration value="INVALID"/>
                           </xsd:restriction>
                        </xsd:simpleType>
                   </xsd:element>
                   <xsd:element name="faultData" type="xsd:string"/>
               </xsd:sequence>
           </xsd:complexType>
        </xsd:element>
        <xsd:simpleType name="param1">
            <xsd:restriction base="xsd:int"/>
        </xsd:simpleType>
        <xsd:simpleType name="param2">
            <xsd:restriction base="xsd:int"/>
        </xsd:simpleType>
        <xsd:simpleType name="param3">
            <xsd:restriction base="xsd:int"/>
        </xsd:simpleType>
        <xsd:element name="Add">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element ref="tns:authToken"/>
                        <xsd:element name="param1" type="tns:param1"/>
                       <xsd:element name="param2" type="tns:param2"/>
                       <xsd:element name="param3" type="tns:param3"/>
                        <xsd:choice>
                            <xsd:element name="Name">
                                <xsd:complexType>
                                    <xsd:sequence>
                                        <xsd:element name="first" type="tns:namefirst"/>
                                        <xsd:element name="last" type="tns:namelast"/>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
....

次に、XML:Compile を使用して、次のことを行います。

use XML::Compile::WSDL11;
use XML::Compile::SOAP11;
use XML::Compile::Transport::SOAPHTTP;
my $wsdlXml = XML::LibXML->new->parse_file("pathtowsdl");
my $wsdl = XML::Compile::WSDL11->new($wsdlXml);
my $call = $wsdl->compileClient('Add');
my %param = ('authToken'    =>  {
                    'username'  =>  'xxx',
                    'password'  =>  'xxxx',
                    },
             'param1'   =>  'xxx',
             'param2'   =>  'xxxx',
             'param3'   =>  'xxxx',
             'Name'     =>  {
                'first' =>  'xxx',
                'last'  =>  'xxx',
              });
my ($response, $trace) = $call->(\%params);

上記から障害が発生します。

非整列化エラー: 予期しない要素 (uri:""、local:"authToken")

「authToken」を取り出すと、「エラー: 要素 `authToken' に必要な値がありません」というローカル エラーが発生します。

私のparams構造が間違っていると思いますが、どうあるべきかわかりません。何か案は?

ティア

4

0 に答える 0