SOAP: похоже, у нас нет XML-документа - PullRequest
11 голосов
/ 30 ноября 2010

Я пытаюсь создать веб-сервис, но прежде чем я пытаюсь получить простой пример, который я нашел в Интернете, чтобы он работал первым, но я продолжаю получать следующую ошибку:

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php:20 Stack trace: #0 [internal function]: SoapClient->__call('getStockQuote', Array) #1 C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php(20): SoapClient->getStockQuote(Array) #2 {main} thrown in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php on line 20

Я использую nusoap v1.94

Мой код веб-службы выглядит следующим образом:

function getStockQuote($symbol) {
$price = '1.23';
return $price;
}

require('nusoap.php');

$server = new soap_server();

$server->configureWSDL('stockserver', 'urn:stockquote');

$server->register("getStockQuote",
            array('symbol' => 'xsd:string'),
            array('return' => 'xsd:decimal'),
            'urn:stockquote',
            'urn:stockquote#getStockQuote');

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
                  ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

Я знаю, что одной из причин является наличие пробела до или после ваших php-тегов в скрипте сервера, ноэто не тот случай.Это сводит меня с ума в течение нескольких часов!Любая помощь будет высоко ценится.

Ответы [ 9 ]

6 голосов
/ 30 ноября 2010

Метка порядка байтов (BOM) будет иметь тот же эффект, что и пробел перед тегами php. Здесь вы найдете фрагмент PHP для обнаружения и удаления спецификации. Обязательно настройте редактор, чтобы он не вставлял спецификацию снова.

6 голосов
/ 16 февраля 2016

Довольно поздно, но добавляю свои исправления в пользу других.Я получил аналогичную ошибку, когда я изменил свой сервер Apache с 2.2 на 2.4 и PHP 5.4.10 на 5.6.18 в Windows.Клиентское приложение использовало php 5.6.1.Чтобы устранить эту проблему, я сделал следующее:

  1. Передан параметр версии SOAP в SoapClient:

    'soap_version' => SOAP_1_1

  2. В файл конфигурации php.ini сервера, который я добавил:

    always_populate_raw_post_data = -1

4 голосов
/ 07 сентября 2012

Немного поздно, но такая ошибка часто вызывается проблемой на стороне сервера (в смысле SOAP):

  • печать / эхо-контент
  • ответ Рика тоже
  • ошибка (например, в настоящее время у меня была эта ошибка из-за неверно написанного имени файла во включении, генерирующая ошибку включения вместо выполнения сценария ...)
  • неверный параметр на SOAP-сервере
  • Не одинаковый уровень сжатия с обеих сторон (если используется сжатие)

Это сообщение просто сообщает вам, что клиент SOAP не получил хорошо отформатированный XML (например, сообщение об ошибке вместо XML).

3 голосов
/ 10 января 2017

установите always_populate_raw_post_data = -1 в файле php.ini (удалив ;), а затем перезапустите сервер. У меня все работало нормально.

3 голосов
/ 13 октября 2015

Эта ошибка также появляется, если мыльный XML-ответ содержит специальные символы Unicode .В моем случае это было REPLACEMENT CHARACTER (U+FFFD).

Подробно, внутренняя функция SoapClient xmlParseDocument устанавливает свойство xmlParserCtxtPtr->wellFormed как false после анализа.Выкидывает мыло по вине с looks like we got no XML document.

https://github.com/php/php-src/blob/master/ext/soap/php_packet_soap.c#L46

2 голосов
/ 21 мая 2012

Я получил эту ошибку, когда я взаимодействовал с Magento API, который загружал модель, и он выдавал предупреждение перед выводом ответа xml, который вызывал ошибку.

Чтобы исправить это, вы можете просто отключить предупреждения в функции API: error_reporting(0);

1 голос
/ 21 июля 2016

Насколько я понимаю, ошибка парсера SOAP, когда он приходит неверный XML.

Как это было у меня.

  1. Включить отображение ошибки
  2. выполняется в try-catch и в вызове catch __getLastResponse
  3. Я ловлю другую ошибку:

Предупреждение: simplexml_load_string (): Entity: строка 1:ошибка синтаксического анализатора: xmlParseCharRef: недопустимое значение xmlChar 26 в

Первым пациентом был PHP5.3.После запуска скрипта на PHP5.4, стала более информативной ошибка - я клянусь на недопустимом символе, из-за которого, предположительно, и упал SOAP-парсер.

В результате я получил следующеекод:

$params = array(...);
try
{
    $response = $client->method( $params );
}
catch(SoapFault $e)
{
    $response = $client->__getLastResponse();
    $response = str_replace("&#x1A",'',$response); ///My Invalid Symbol
    $response = str_ireplace(array('SOAP-ENV:','SOAP:'),'',$response);
    $response = simplexml_load_string($response);
}

Если кто-то скажет в комментариях, что за символ, буду благодарен.

0 голосов
/ 23 марта 2015

Другое возможное решение ...

У меня была такая же проблема, я сходил с ума.Решение было простым.Проверка моего сервера .. потому что это ошибка сервера.Моя ошибка заключалась в том, что я поставил «rcp» вместо «rpc».

0 голосов
/ 14 мая 2014

Попробуйте заглянуть в журнал вашего сервера.Если вы используете nginx, загляните в /var/log/nginx/error.log.если всплывающее окно «Отказано в доступе», измените владельца соответствующего каталога.Надеюсь, это сработает.

...