Я могу создавать необработанный 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?
По умолчанию он должен следовать перенаправлениям, маловероятно, что вы увидите это сообщение из-за сбоя перенаправления.
Однако, если вам действительно нужно специально изменить поведение перенаправления, просто создайте контекст для подключения:
<?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?
Добавление кода stream_context не сработало, как вы и предполагали, однако использование file_get_contents было гениальным. Мне удалось извлечь заголовок местоположения из $ http_response_header и передать его в параметр местоположения при буферизации SOAPClient. Большое спасибо!