2015-05-22 2 views
5

Я использую perl soap :: lite для создания клиента веб-сервисов. Реализация отлично работает для простых методов, которые будут, например, требуется один скалярный аргумент. EG, нижеследующий работает нормально.Мыло Perl :: lite и сложные данные

#!/usr/bin/perl 

use warnings; 
use SOAP::Lite +trace=>debug; 
use strict; 
use Data::Dumper; 
$SOAP::Constants::PREFIX_ENV = 'SOAP-ENV'; 
my $base="https://XXXX:60001/GDBIncidentWebService/Config?wsdl&style=rpc"; 
my $user="XXXX"; 
my $pwd="XXXX"; 

my $lite = SOAP::Lite -> readable(1) 
        -> service($base) ; 
my @res=$lite->readIncident("123456"); 
print Dumper(\@res); 
exit; 
sub SOAP::Transport::HTTP::Client::get_basic_credentials { return $user => $pwd ; } 

нужно вызвать один метод, который требует более сложного набора аргументов (несколько скаляры плюс один массив пар ключ-значение). Я полагаю, что я должен использовать модуль SOAP :: Data для правильной сериализации моих данных, но не могу заставить его работать. Даже «простые» методы (например, выше) не работают. EG (только с указанием линий изменяется от вышеприведенного сценария):

my $arg= SOAP::Data->new()->type('xs:string')-> value("20054106"); 
my @res=$lite->readIncident($arg); 

Урожайность:

String value expected instead of SOAP::Data reference 

Любая идея о том, как это исправить? Большое спасибо ! Для справки здесь является WSDL для метода, называемого в моем сценарии

<wsdl:operation name="readIncident"> 
    <soap:operation soapAction=""/> 
    <wsdl:input> 
    <soap:body use="literal" namespace="urn:GDBIncidentWebServiceVi" parts="ticketID "/> 
    </wsdl:input> 
    <wsdl:output> 
    <soap:body use="literal" namespace="urn:GDBIncidentWebServiceVi"/> 
    </wsdl:output> 
</wsdl:operation> 

Полный WSDL выглядит следующим образом: - распространение в 3-х файлов. Основной файл WSDL:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="GDBIncidentWebServiceWsd" targetNamespace="urn:GDBIncidentWebServiceWsd" xmlns:bns0="urn:GDBIncidentWebServiceWsd/Config/rpc" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 
    <wsdl:import location="./bindings/Config_rpc.wsdl" namespace="urn:GDBIncidentWebServiceWsd/Config/rpc"/> 
    <wsdl:service name="GDBIncidentWebService"> 
    <wsdl:port name="ConfigPort_Rpc" binding="bns0:ConfigBinding"> 
     <soap:address location="http://xxxx/GDBIncidentWebService/Config?style=rpc"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Наручники файл (экстракт)

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://www.w3.org/2001/XMLSchema" xmlns:ns0="urn:com.dbag.gde.gdb.types" targetNamespace="urn:GDBIncidentWebServiceWsd/GDBIncidentWebServiceVi/rpc" xmlns:tns="urn:GDBIncidentWebServiceWsd/GDBIncidentWebServiceVi/rpc" xmlns:ns2="urn:java/lang"> 
     <wsdl:types> 
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:com.dbag.gde.gdb.types" xmlns:tns="urn:com.dbag.gde.gdb.types" elementFormDefault="qualified"> 
     <xs:complexType name="KeyValuePair"> 
     <xs:sequence> 
      <xs:element name="key" type="xs:string" nillable="true" minOccurs="0"/> 
     <xs:element name="value" type="xs:string" nillable="true" minOccurs="0"/> 
     </xs:sequence> 
     </xs:complexType> 
     <xs:complexType name="ArrayOfKeyValuePair"> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="KeyValuePair" type="tns:KeyValuePair" nillable="true"/> 
     </xs:sequence> 
     </xs:complexType> 
     </xs:schema> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:java/lang" xmlns:tns="urn:java/lang" elementFormDefault="qualified"> 
     <xs:complexType name="ArrayOfString"> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="String" type="xs:string" nillable="true"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:schema> 
    </wsdl:types> 
    <wsdl:message name="createInsourcingIncidentIn"> 
    <wsdl:part name="externalKey" type="ns1:string"/> 
    <wsdl:part name="title" type="ns1:string"/> 
    <wsdl:part name="description" type="ns1:string"/> 
    <wsdl:part name="impact" type="ns1:string"/> 
    <wsdl:part name="urgency" type="ns1:string"/> 
    <wsdl:part name="contact" type="ns1:string"/> 
    <wsdl:part name="creatorGroup" type="ns1:string"/> 
    <wsdl:part name="category1" type="ns1:string"/> 
    <wsdl:part name="category2" type="ns1:string"/> 
    <wsdl:part name="category3" type="ns1:string"/> 
    <wsdl:part name="extReference" type="ns0:ArrayOfKeyValuePair"/> 
    <wsdl:part name="attachments" type="ns0:ArrayOfAttachment"/> 
    <wsdl:part name="additionalFields" type="ns0:ArrayOfKeyValuePair"/> 
    <wsdl:part name="assignmentGroup" type="ns1:string"/> 
    <wsdl:part name="assignmentSubGroup" type="ns1:string"/> 
    <wsdl:part name="productId" type="ns1:string"/> 
    <wsdl:part name="productName" type="ns1:string"/> 
    <wsdl:part name="service" type="ns1:string"/> 
    <wsdl:part name="customer" type="ns1:string"/> 
    </wsdl:message> 

    <wsdl:portType name="GDBIncidentWebServiceVi_Rpc"> 
    <wsdl:operation name="createInsourcingIncident"> 
     <wsdl:input message="tns:createInsourcingIncidentIn"/> 
     <wsdl:output message="tns:createInsourcingIncidentOut"/> 
    </wsdl:operation> 
    </wsdl:portType> 
</wsdl:definitions> 

Определение операции

<wsdl:operation name="createInsourcingIncident"> 
     <soap:operation soapAction=""/> 
     <wsdl:input> 
     <soap:body use="literal" namespace="urn:GDBIncidentWebServiceVi" parts="externalKey title description impact urgency contact creatorGroup category1 category2 category3 extReference attachments additionalFields assignmentGroup assignmentSubGroup productId productName service customer "/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" namespace="urn:GDBIncidentWebServiceVi"/> 
     </wsdl:output> 
    </wsdl:operation> 
+1

Возможно [это поможет] (http://www.perlmonks.org/?node_id=920498). –

+1

И [это] (http://search.cpan.org/dist/SOAP-Lite/lib/SOAP/Data.pod) поможет еще больше. Он показывает вам, как код Perl будет отображаться в XML. Вам нужно будет посмотреть на свой WSDL для получения дополнительной информации, и мы, вероятно, не можем дать вам окончательного ответа. –

+0

Дальнейшее исследование: я вижу, что если я хочу сериализоваться с использованием модуля SOAP :: Data, я должен (должен?) Вообще не использовать службу wsdl, а скорее создать дескриптор SOAP :: Lite с использованием прокси и uri. Это правда ? Я не мог найти убедительных доказательств об этом ... – PPX

ответ

1

Update и разрешение. Похоже, что с помощью метода proxy/uri для создания объекта SOAP :: Lite (вместо простого ссылки на службу WSDL) строки являются обязательными, если вы хотите передать сложные данные Поэтому код теперь выглядит следующим образом для простого запрос:

my $base="https://XXXXX/GDBIncidentWebService/Config?wsdl&style=rpc"; 
my $uri="urn:GDBIncidentWebServiceVi" 
my $ticketID='20054106'; 
my $lite = SOAP::Lite -> proxy($base) 
      -> uri($uri); 
my $res = $lite -> readIncident(SOAP::Data->('ticketID' => $ticketID)) 
      -> result; 
print Dumper($res); 
+0

Проверьте приведенные выше ресурсы, чтобы узнать, как вы можете обрабатывать массив. –

Смежные вопросы