У меня проблемы с формированием SOAP-запроса с использованием perl-модуля SOAP :: Lite.
Вот WSDL-схема:
<wsdl:definitions xmlns:p1="http://example.com/SOAP/PList" name="SI_PList_2_SRM_SO" targetNamespace="http://example.com/SOAP/PList">
<wsdl:documentation />
<wsp:UsingPolicy wsdl:required="true" />
<wsp:Policy wsu:Id="OP_SI_PList_2_SRM_SO" />
<wsdl:types>
<xsd:schema xmlns="http://example.com/SOAP/PList" targetNamespace="http://example.com/SOAP/PList">
<xsd:element name="MT_PList_Response" type="DT_PList_Response" />
<xsd:element name="MT_PList_Request" type="DT_PList_Request" />
<xsd:simpleType name="DT_PList_Request">
</xsd:simpleType>
<xsd:complexType name="DT_PList_Response">
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="MT_PList_Request">
<wsdl:documentation />
<wsdl:part name="MT_PList_Request" element="p1:MT_PList_Request" />
</wsdl:message>
<wsdl:message name="MT_PList_Response">
<wsdl:documentation />
<wsdl:part name="MT_PList_Response" element="p1:MT_PList_Response" />
</wsdl:message>
<wsdl:portType name="SI_PList_2_SRM_SO">
<wsdl:operation name="SI_PList_2_SRM_SO">
<wsdl:documentation />
<wsp:Policy>
<wsp:PolicyReference URI="#OP_SI_PList_2_SRM_SO" />
</wsp:Policy>
<wsdl:input message="p1:MT_PList_Request" />
<wsdl:output message="p1:MT_PList_Response" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SI_PList_2_SRM_SOBinding" type="p1:SI_PList_2_SRM_SO">
<wsdl:operation name="SI_PList_2_SRM_SO"/>
</wsdl:binding>
<wsdl:service name="SI_PList_2_SRM_SOService">
<wsdl:port name="HTTPS_Port" binding="p1:SI_PList_2_SRM_SOBinding">
<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="https://s.example.com/api/etender/SI_PList_2_SRM_SO" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Инструкции по использованию SOAP API говорят о том, что ядолжен вызвать процедуру SI_PList_2_SRM_SO.Я написал простой тестовый скрипт:
use SOAP::Lite +trace => [ transport => sub { say $_[0]->as_string } ];
my $api_host = "http://s.example.com/srm/api/etender/wsdl";
my $api_namespace = "http://example.com/SOAP/PList";
#my $soap = SOAP::Lite->new(uri => $api_namespace, proxy => $api_host);
my $soap = SOAP::Lite->service($api_host);
$soap->serializer->envprefix('soapenv');
my $result = $soap->SI_PList_2_SRM_SO();
Он формирует запрос:
<soapenv:Envelope xmlns:p1="http://example.com/SOAP/PList" >
<soapenv:Body>
<p1:SI_PList_2_SRM_SO xsi:nil="true" />
</soapenv:Body>
</soapenv:Envelope>
Но из поддержки службы SOAP Server я знаю, что правильный запрос xml должен быть:
<soapenv:Envelope xmlns:get="http://example.com/SOAP/PList">
<soapenv:Header/>
<soapenv:Body>
<get:MT_PList_Request>test</get:MT_PList_Request>
</soapenv:Body>
</soapenv:Envelope>
Так что у меня должен быть другой тег в Body.Также я проверил SOAP Client Test Service , который сформировал правильный XML-запрос с тегом MT_PList_Request.
Если я вместо этого использую непосредственно MT_PList_Request, я ожидаю, что получаю ошибку «Нераспознанный метод« MT_PList_Request ». Списокдоступные методы: SI_PList_2_SRM_SO "
Также я не могу использовать метод отправки необработанного XML, например
my $element = SOAP::Data->type('xml' => $xml);
my $result = $soap->SI_PList_2_SRM_SO($element);
, поскольку SI_PList_2_SRM_SO, вызываемый с параметрами, получает исключение" Схема / пространство имен для типа "DT_PList_Request 'не указан ".
Если я поменяю метод service
на метод new
, то, как ожидается, ничего не изменится, в любом случае запрос xml имеет неправильный тег.