SOAP: looks like we got no XML document

2019-02-16 13:48发布

I'm trying to create a web service but before I do I'm trying to get a simple example that I found on the internet to work first but I keep getting the following error:

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

I am using nusoap v1.94

My web service code looks like this:

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

I know one cause is to have whitespace before or after your php tags in your server script but thats not the case. It has been driving me mad for hours! Any help would be much appreciated.

标签: php soap nusoap
9条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-02-16 13:49

set always_populate_raw_post_data = -1 in php.ini file (by removing the ; ) and then restart the server. It worked fine for me.

查看更多
Melony?
3楼-- · 2019-02-16 13:51

A byte order mark (BOM) would have the same effect as whitespace before the php tags. Here you find a PHP snippet to detect and remove a BOM. Be sure to configure you editor to not insert the BOM again.

查看更多
神经病院院长
4楼-- · 2019-02-16 13:53

I received this error when I was interacting with the Magento API which was loading a model, and it was throwing a warning before outputting the xml response which was causing the error.

To fix it you can simply turn off warnings on the API function: error_reporting(0);

查看更多
啃猪蹄的小仙女
5楼-- · 2019-02-16 13:57

As far as I understand, the error of the SOAP parser when it comes invalid XML.

As it was with me.

  1. Turn on the display of the error
  2. performed in try-catch and in the catch call __getLastResponse
  3. I catch another error:

Warning: simplexml_load_string(): Entity: line 1: parser error : xmlParseCharRef: invalid xmlChar value 26 in

  1. The first patient was PHP5.3. Once run the script on the PHP5.4, became more informative error - I swear on an invalid character, because of which, presumably, and fell SOAP parser.

As a result, I obtained the following code:

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

If someone will tell in the comments what a symbol, I will be grateful.

查看更多
Animai°情兽
6楼-- · 2019-02-16 14:00

This error appears also if a soap XML response contains special Unicode characters. In my case it was REPLACEMENT CHARACTER (U+FFFD).

In details, inner function of the SoapClient xmlParseDocument sets xmlParserCtxtPtr->wellFormed property as false after parsing. It throws soap fault with looks like we got no XML document.

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

查看更多
混吃等死
7楼-- · 2019-02-16 14:02

Try to look into your server log. If you use nginx, please look into /var/log/nginx/error.log. if "Permission denied" pop up, please change related dir owner. Hope it will work.

查看更多
登录 后发表回答