PHP SOAPClient эквивалент CURLOPT_FOLLOWLOCATION? - PullRequest
0 голосов
/ 13 сентября 2018

Я могу создать необработанный XML и обмениваться данными с сервером, используя curl с CURLOPT_FOLLOWLOCATION, установленной в true. По словам поставщика услуг 307 перенаправления являются правилом, и хосты могут меняться в любое время.

XML для этого проекта является массивным и многословным. Я не хочу работать с необработанным XML; Я хочу использовать SOAPClient.

Этот код SOAPClient приводит к SoapFault "message": protected] => string (25) "Не удалось подключиться к хосту"

$url = "https://vmi21.example.net/VMIService.asmx";
$options = [ 'trace' => 1 ];

$soapClient = new SOAPClient($url . '?wsdl', $options );

try
{
    $result = $soapClient->GetCompanyList( $params );
}
catch (SoapFault $soapFault)
{
    var_dump($soapFault);
}

После большой отладки я заметил URL в трассировке:

...
[1]=> string(41) "https://vmi8.example.net/VMIService.asmx"
...

Предполагая, что именно здесь 307 перенаправил локон, я установил следующее в параметрах SOAPClient, и это сработало!

[ 'location' => 'https://vmi8.example.net/VMIService.asmx' ] 

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

Есть ли какой-нибудь способ указать SOAPClient следовать этим перенаправлениям, как делает curl, если для параметра CURLOPT_FOLLOWLOCATION установлено значение true?

1 Ответ

0 голосов
/ 13 сентября 2018

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

Однако, если вам нужно специально изменить поведение перенаправления, просто создайте контекст для соединения:

<?php
$ctx = stream_context_create(["http" => ["follow_location" => 1]]);
$options = ["trace" => 1, "stream_context" => $ctx];
$soapClient = new SOAPClient("$url?wsdl", $options);

Вероятно, есть проблема с брандмауэром или какая-то проблема с их ответом, что и является причиной этого. Если, как вы предлагаете, он работает с cURL, возможно, хорошей стратегией может быть использование cURL или file_get_contents , отключение перенаправлений, получение содержимого заголовка Location и подача его в конструктор SoapClient?

...