Я не очень разбираюсь в PHP, но около месяца назад я написал скрипт для извлечения данных о событиях из веб-службы SOAP для отображения на цифровых вывесках. Несколько недель он работал нормально, но недавно сломался.
Вот соответствующий код PHP …
$WSDL_URL = 'http://anprodca.active.com/uofg/servlet/ActiveNetWS?wsdl';
$params = array(
"ws_system_user" => $credentials,
"resource_ids" => array(intval($facilityID)),
"dates" => $date,
"include_linked_resources" => 0,
"returning_render_customer_id" => 0
);
$soap = new SoapClient($WSDL_URL);
$response = $soap->wsGetResourceBookings($params);
… с $credentials
содержащий userName
, password
, а также keepAlive
значения в массиве.
Когда я получаю его, я получаю следующее сообщение об исключении: looks like we got no XML document
, Я видел похожие посты в stackoverflow о проблемах с искаженными ответами из-за проблемных невидимых символов, но это не тот случай. Ответ от __getLastResponse()
кажется HTML от перенаправления какого-то рода?
Я все еще могу получить желаемый результат, используя SoapUI. Ниже приведен пример XML, который он передает в запросе, сгенерированном из URL WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ANWebServices/">
<SOAP-ENV:Body>
<ns1:wsGetResourceBookings>
<ws_system_user>
<keepAlive>false</keepAlive>
<password>password</password>
<userName>username</userName>
</ws_system_user>
<resource_ids>
<entries>27</entries>
</resource_ids>
<dates>09/25/2016</dates>
<include_linked_resources>0</include_linked_resources>
<returning_render_customer_id>0</returning_render_customer_id>
</ns1:wsGetResourceBookings>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Используя опцию трассировки и __getLastRequest()
с SoapClient я получил следующий XML, который также работал нормально при передаче с SOAPUI …
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:anw="http://ANWebServices/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ANWebServices/">
<soapenv:Header/>
<soapenv:Body>
<anw:wsGetResourceBookings>
<ws_system_user>
<keepAlive>false</keepAlive>
<password>password</password>
<userName>username</userName>
</ws_system_user>
<resource_ids>
<entries>27</entries>
</resource_ids>
<dates>09/25/2016</dates>
<include_linked_resources>0</include_linked_resources>
<returning_render_customer_id>0</returning_render_customer_id>
</anw:wsGetResourceBookings>
</soapenv:Body>
</soapenv:Envelope>
Я предположил, что WSDL файл изменился, но это не так.
Ничего на стороне сервера не изменилось, он все еще использовал ту же версию PHP с той же конфигурацией и т. Д. Я пытался отключить кэширование WSDL, а также библиотеку NuSoap, но безрезультатно. Я не могу понять, почему я не могу PHP получить правильный ответ с помощью SoapClient. Любое понимание будет оценено, спасибо!
Я смог решить эту проблему самостоятельно — просто опубликовал это на тот случай, если кто-нибудь столкнется с подобной проблемой.
В их файле WSDL указан неправильный URL-адрес конечной точки. Я просто должен был явно указать это с помощью __setLocation()
, Теперь мой PHP выглядит примерно так:
...
$soap = new SoapClient($WSDL_URL);
$soap->__setLocation($WSDL_URL);
$response = $soap->wsGetResourceBookings($params);
...
1 линия исправлена
Других решений пока нет …