Ошибка SOAP при кодировании внешней ссылки в PHP - PullRequest
2 голосов
/ 05 января 2010

Я пытаюсь использовать функцию из SOAP, которая будет извлекать сведения о конкретной новости. Проблема в том, что я не получаю ожидаемых результатов, просто странная ошибка. Я использую встроенный клиент SOAP в PHP5.

Моя ошибка:

Фатальная ошибка: Uncaught SoapFault исключение: [Клиент] SOAP-ОШИБКА: Кодировка: Внешняя ссылка «https://newsclient.omxgroup.com/cdsPublic/viewDisclosure.action?disclosureId=379485&messageId=454590' в /home/********/public_html/********/updatenews3.php:15

Мой код:

<?php
    $login = '***';
    $password = '***';   
    $client = new SoapClient(
    'https://newsclient.omxgroup.com/wsdl/DisclosureNewsService.wsdl',
    array(
        'login' => $login,
        'password' => $password
    ));
    $param = array('lastPublicationId' => 361825);
    $result = $client->fetchNews($param);
?>

Ошибка одинакова для всех lastPublicationId, где найден результат. Кажется, что PHP пытается загрузить ссылку, которая находится где-то в XML-ответе (URL-адрес в сообщении об ошибке), и не может получить к ней доступ. Хотя я много гуглил, я не могу найти никакого решения. Единственное, что я могу найти, - это то, что, как мне кажется, об этом сообщалось как об ошибке в предыдущей версии PHP, но ошибка относится к PHP 5.2.2. Так как я использую PHP 5.2.9, я думаю, что это возможно ». быть таким. Я подозреваю, что причиной этой ошибки является & -character?

WSDL-файл можно найти здесь: https://newsclient.omxgroup.com/wsdl/DisclosureNewsService.wsdl

Кто-нибудь знает эту ошибку и знает какое-либо решение?

1 Ответ

2 голосов
/ 07 января 2010

Возможно, что XML, возвращаемый $client->fetchNews($param);, не экранирован должным образом - кажется, что в URL-адресе, который показан в сообщении об ошибке, нет экранирования.

Лучше всего проверить, какой именно XML возвращается, включив трассировку и напечатав последний ответ:

$client = new SoapClient(
'https://newsclient.omxgroup.com/wsdl/DisclosureNewsService.wsdl',
array(
    'login' => $login,
    'password' => $password,
    'trace' => 1
));
$param = array('lastPublicationId' => 361825);

try {
    $result = $client->fetchNews($param);
}
catch (SoapFault $sf) {
    print '<pre>';
    // print the exception
    print_r($sf);

    // print the XML response
    print $client->__getLastResponse();
}

Обходной путь (если сервер возвращает недопустимый XML) - использовать код, подобный приведенному выше, чтобы перехватить исключение. Затем вы можете вручную получить возвращенный XML-код (используя __getLastResponse()) и очистить его самостоятельно (например, с помощью htmlenties или regexp), прежде чем возвращать его и использовать в остальной части приложения.

...