【问题标题】:Making SOAP call using Perl's SOAP::Lite and a WSDL file使用 Perl 的 SOAP::Lite 和 WSDL 文件进行 SOAP 调用
【发布时间】:2012-08-17 00:01:21
【问题描述】:

我想对本地 Web 服务进行 SOAP 调用。 Web 服务是通过 WSDL 文件定义的(见下文)。我想使用 Perl 和 SOAP::Lite。我试过这个:

use strict ;
use warnings ;

use SOAP::Lite ;

my $endpoint = qq{http://example.com:2222/orawsv/PS_API/ACCOUNT_WS} ;
my $tns = 'http://xmlns.oracle.com/orawsv/PS_API/ACCOUNT_WS' ;

my $method_urn = $tns ;
my $soapaction = $tns ;
my $method = 'GET_BY_ACCOUNT_NUMBER' ;

my $sObj = SOAP::Lite->new(uri => $soapaction, proxy => $endpoint) ;

my $response = $sObj->call(SOAP::Data->name($method)->attr({ 'xmlns' => $method_urn})
            => SOAP::Data->name('ACCOUNT_NUMBER-VARCHAR2-IN' => '274724')) ;

print $response->faultstring() . "\n";

但是,这会导致出现XML parsing failed 错误消息。调用此方法的正确 SOAP::Lite 代码是什么?

上面生成的HTTP请求是

Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 553
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://xmlns.oracle.com/orawsv/PS_API/ACCOUNT_WS#GET_BY_ACCOUNT_NUMBER"

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GET_BY_ACCOUNT_NUMBER xmlns="http://xmlns.oracle.com/orawsv/PS_API/ACCOUNT_WS">
      <ACCOUNT_NUMBER-VARCHAR2-IN xsi:type="xsd:int">274724</ACCOUNT_NUMBER-VARCHAR2-IN>
    </GET_BY_ACCOUNT_NUMBER>
  </soap:Body>
</soap:Envelope>

这是定义 Web 服务的 WSDL 文件:

<definitions name="ACCOUNT_WS" 
targetNamespace="http://xmlns.oracle.com/orawsv/PS_API/ACCOUNT_WS" 
xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:tns="http://xmlns.oracle.com/orawsv/PS_API/ACCOUNT_WS" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
    <types>
        <xsd:schema targetNamespace="http://xmlns.oracle.com/orawsv/PS_API/ACCOUNT_WS" elementFormDefault="qualified">     
            <xsd:element name="CACCOUNT_A-GET_BY_ACCOUNT_NUMBERInput">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="ACCOUNT_NUMBER-VARCHAR2-IN" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="GET_BY_ACCOUNT_NUMBEROutput">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="RETURN" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>            
        </xsd:schema>
    </types>
    <message name="GET_BY_ACCOUNT_NUMBERInputMessage">
        <part name="parameters" element="tns:CACCOUNT_A-GET_BY_ACCOUNT_NUMBERInput"/>
    </message>
    <message name="GET_BY_ACCOUNT_NUMBEROutputMessage">
        <part name="parameters" element="tns:GET_BY_ACCOUNT_NUMBEROutput"/>
    </message>
    <portType name="ACCOUNT_WSPortType">
        <operation name="GET_BY_ACCOUNT_NUMBER">
            <input message="tns:GET_BY_ACCOUNT_NUMBERInputMessage"/>
            <output message="tns:GET_BY_ACCOUNT_NUMBEROutputMessage"/>
        </operation>
    </portType>
    <binding name="ACCOUNT_WSBinding" type="tns:ACCOUNT_WSPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GET_BY_ACCOUNT_NUMBER">
            <soap:operation soapAction="GET_BY_ACCOUNT_NUMBER"/>
            <input>
                <soap:body parts="parameters" use="literal"/>
            </input>
            <output>
                <soap:body parts="parameters" use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="ACCOUNT_WSService">
        <documentation>Oracle Web Service</documentation>
        <port name="ACCOUNT_WSPort" binding="tns:ACCOUNT_WSBinding">
            <soap:address  location="http://example.com:2222/orawsv/PS_API/ACCOUNT_WS"/>
        </port>
    </service>
</definitions>

【问题讨论】:

    标签: perl soap wsdl


    【解决方案1】:

    由于您拥有 WSDL,因此您根本不必构造 SOAP::Data 对象。只需将 WSDL 加载到您的客户端对象中并直接调用该方法:

    my $client = SOAP::WSDL->new(wsdl => $url_of_wsdl);
    my $result = $client->$method(@arguments);
    

    是的,就是这么简单!

    【讨论】:

      【解决方案2】:

      看起来这已经有一年了,所以这可能不再相关。无论如何,根据 CPAN 上的 soap::lite 文档,您似乎想要这样做:

      my $response = $sObj->call(SOAP::Data->name($method)->attr({ 'xmlns' => $method_urn}),
          SOAP::Data->name('parameters')->value(SOAP::Data->value([
              SOAP::Data->name('ACCOUNT_NUMBER-VARCHAR2-IN' => '274724'),
          ]))
      );
      
      die $response->fault->{ faultstring } if ($response->fault);
      print $response->result, "\n";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多