#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