Обходной путь для сбоя запроса PHP SOAP, когда wsdl определяет привязку порта службы как https и порт 80?

Я использую веб-службу SOAP, используя расширение мыла php5. Служба wsdl была сгенерирована с использованием Axis java2wsdl, и любые параметры, используемые во время генерации, приводят к тому, что URL-адрес привязки порта отображается как https://xxx.xxx.xxx.xxx**:80**

Если я загружаю wsdl на свой сервер, удаляю спецификацию порта 80 из значения местоположения привязки порта и ссылаюсь на локальный файл в моем вызове soapclient, он работает нормально.

Однако, если я попытаюсь сослаться на него удаленно (или загрузить его и сослаться на него локально, как есть), вызов завершится ошибкой мыла.

Я не имею никакого отношения к сервисной стороне, поэтому я не могу заставить их изменить процесс генерации wsdl. Таким образом, если нет способа заставить мыльный клиент не знать о порте, я застрял с использованием локально модифицированной копии чужого wsdl (чего я бы предпочел не делать).

Любые мысли о том, как заставить мой soapclient игнорировать порт 80?


person scooterhanson    schedule 17.09.2009    source источник
comment
Вы получаете мыльную ошибку уже при построении объекта (new SoapClient()) или при первой попытке вызвать метод службы?   -  person Henrik Opel    schedule 18.09.2009


Ответы (2)


Возможно, вы захотите попробовать переопределить имя хоста/порт, используя массив $options, который вы можете передать в качестве второго аргумента конструктору SoapClient:

$client = new SoapClient("some.wsdl", array('proxy_host' => "https://example.org", 'proxy_port' => 443);

person 12345    schedule 17.09.2009
comment
Интересный. Итак, предположим, что URL-адрес wsdl — example.org/service?wsdl и что привязка порта в wsdl это 192.168.1.1:80/servicebinding (в этом случае, очевидно, балансировка нагрузки позади сервер example.org). Будет ли мой proxy_host по-прежнему иметь имя example.org? Мне, наверное, нужно просто поэкспериментировать. - person scooterhanson; 17.09.2009

Если вы не можете найти более элегантное решение, вы всегда можете загрузить файл, выполнить замену строк, а затем использовать его как WSDL.

$cached_wsdl_file = './cached_wsdl.xml';
if (filemtime($cached_wsdl_file) > time() - 3600) {
    $wsdl = file_get_contents('http://server/service?wsdl');
    $wsdl = str_replace('server:80', 'server', $wsdl);
    file_put_contents($cached_wsdl_file, $wsdl);
}
$client = new SoapClient($cached_wsdl_file);
person Kurt Payne    schedule 09.11.2009