I want to make a SOAP call for a local web service. A web service is defined through a WSDL file (see below). I want to use Perl and SOAP :: Lite. I tried this:
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";
However, this leads to an XML parsing failed error message. What will be the correct SOAP :: Lite code to call this method?
HTTP request generated above
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>
Here is the WSDL file that defines the web service:
<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>
source share