SOAP: похоже, у нас нет XML-документа

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

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in C:Documents and SettingsgeoffMy DocumentsWebsitesjqueryindex.php:20 Stack trace: #0 [internal function]: SoapClient->__call('getStockQuote', Array) #1 C:Documents and SettingsgeoffMy DocumentsWebsitesjqueryindex.php(20): SoapClient->getStockQuote(Array) #2 {main} thrown in C:Documents and SettingsgeoffMy DocumentsWebsitesjqueryindex.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 ответов


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


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

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

    '' = > SOAP_1_1
  2. на сервере php.файл конфигурации ini у меня есть добавлено:

    always_populate_raw_post_data = -1


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

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

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


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

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

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


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


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

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


насколько я понимаю, ошибка парсера SOAP, когда речь идет о недопустимом XML.

Как это было со мной.

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

предупреждение: simplexml_load_string (): сущность: строка 1: ошибка парсера : xmlParseCharRef: недопустимое значение xmlChar 26 В

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

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

$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);
}

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


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


еще одно возможное решение...

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