Какие заголовки я должен добавить в запрос CURL для доступа к WSDL

#php #curl #soap

Вопрос:

Я пытаюсь реализовать клиент веб-сервиса SOAP, чтобы получить состояние пакета. Я отправляю этот запрос через пользовательский интерфейс SOAP, и сервер возвращает ответ должным образом

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetEnvios>
         <!--Optional:-->
         <tem:login>USER</tem:login>
         <!--Optional:-->
         <tem:pass>PASSWORD</tem:pass>
         <!--Optional:-->
         <tem:codigoIdioma>3082</tem:codigoIdioma>
         <!--Optional:-->
         <tem:tipoFiltro>0</tem:tipoFiltro>
         <!--Optional:-->
         <tem:valorFiltroDesde>038224807003</tem:valorFiltroDesde>
        
         <!--Optional:-->
         <tem:fechaDesde>01/01/2021</tem:fechaDesde>
         <!--Optional:-->
         <tem:fechaHasta>31/12/2021</tem:fechaHasta>
         <!--Optional:-->
         <tem:tipoInformacion>1</tem:tipoInformacion>
      </tem:GetEnvios>
   </soapenv:Body>
</soapenv:Envelope>
 

Но когда я пытаюсь проверить веб-сервис через своего сервисного клиента с помощью CURL, я всегда получаю один и тот же ответ

 <sEnvelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><sBody><sFault><faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faultstring xml:lang="es-ES">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></sFault></sBody></sEnvelope>
 

Мой класс подключения делает

 $datos = "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetEnvios>
         <!--Optional:-->
         <tem:login>user</tem:login>
         <!--Optional:-->
         <tem:pass>password</tem:pass>
         <!--Optional:-->
         <tem:codigoIdioma>3082</tem:codigoIdioma>
         <!--Optional:-->
         <tem:tipoFiltro>0</tem:tipoFiltro>
         <!--Optional:-->
         <tem:valorFiltroDesde>038224807003</tem:valorFiltroDesde>

         <!--Optional:-->
         <tem:fechaDesde>01/01/2021</tem:fechaDesde>
         <!--Optional:-->
         <tem:fechaHasta>31/12/2021</tem:fechaHasta>
         <!--Optional:-->
         <tem:tipoInformacion>1</tem:tipoInformacion>
      </tem:GetEnvios>
   </soapenv:Body>
</soapenv:Envelope>";

        $headers = array(
            "Content-type: text/xml;charset="utf-8""); //SOAPAction: your op URL

        // PHP cURL  for https connection with auth
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $datos); // the SOAP request
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        // converting
        $response = curl_exec($ch);
 

Я предполагаю, что это может быть связано с заголовком, но я не знаю, какие из них должны быть.

Спасибо

Комментарии:

1. Есть ли какая-либо причина, по которой вы не используете SOAP-клиент PHP? Я бы ожидал, что это, скорее всего, упростит ситуацию. php.net/manual/en/book.soap.php

2. Это связано с тем, что в этом веб-сервисе есть библиотека, которая снова выполняет некоторые запросы на публикацию, и я хотел расширить функциональность, добавив запрос get

3. Может быть, вам стоит проверить, как это делает библиотека, тогда

4. Но библиотека выполняет только запросы POST, и я должен реализовать первую функцию GET.

5. Вы уверены , что вам нужен запрос на получение? Поскольку SOAP обычно не использует GET, а запросы GET не содержат тела запроса, содержащего XML