PHP SOAPClient эквивалент CURLOPT_FOLLOWLOCATION?

Я могу создавать необработанный 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 в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
312
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

<?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. Большое спасибо!

Craig Jacobs 13.09.2018 02:00

Другие вопросы по теме