Maison  >  Article  >  développement back-end  >  php soap 错误 “looks like we got no XML document”

php soap 错误 “looks like we got no XML document”

WBOY
WBOYoriginal
2016-06-06 20:51:231723parcourir

今天在想使用soap开发相关接口给合作的公司调用,但是遇到了这个错误。排查了很久,在google也查了很久,但都不是我所遇到的问题。不过我最终错误发现跟soapserver传输的数据量的大小有关系(不知道这个描述是否恰当)。当我从数据库取10条数据,那么就可以很容易的使用soapclient获取到数据,但是当我从数据库里查询1000条数据的时候就会报错了(“Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in……”)!如果我直接运行person.class.php程序是可以显示完整的xml文档的。这根服务器的环境配置会有关系吗?我对于soap认识并不深,也只是现学现卖。希望有经验的前辈们可以指点一二。多谢了!
以下是我的程序代码:

<?php //person.class.php文件
class person
{
	 public function getInfo()
	 {
	 	$strGetList = 'SELECT * FROM information LIMIT 100';
	 	$GLOBALS['le']->query($strGetList);
	 	$results = array();
	 	$xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
	 	$xmlString .="<data>\n";
	 	while( $rows = $GLOBALS['le']->fetch_assoc() ) {
	 		$results[] = $rows;
	 	}
	 	foreach($results as $key=>$val) {
	 		$xmlString .="<rec id="UU{$key}">\n";
	 		foreach($val as $k=>$v ) {
	 			if(strlen($v)>0) {
	 				$v = htmlspecialchars($v);
		 			$xmlString .=" <uu>$v</uu>{$k}>\n";
		 		}
	 		}
	 		$xmlString .="</rec>\n";
	 	}
	 	$xmlString .="</data>\n";
	 	return $xmlString;
	 }
}
//$p = new person;
//echo $p->getInfo();//经测试xml中可以显示所有数据

--- 分割线 ---

<?php //server.php文件
include("person.class.php");
$server = new SoapServer(null,array('uri'=>'abcd','encoding'=>'UTF-8'));
$server->setClass('person');
$server->handle();

--- 分割线 ---

<?php //client.php文件
try{
	$soap = new SoapClient(null,array(
		'location'=>'http://192.168.1.126:102/server.php',
		'uri'=>'abcd',
 		'encoding' => 'UTF-8',
	));
	$s1 =$soap->__soapCall('getInfo',array());
	echo $s1;
} catch(Exction $e) {
	echo $e->getMessage();
}

回复内容:

今天在想使用soap开发相关接口给合作的公司调用,但是遇到了这个错误。排查了很久,在google也查了很久,但都不是我所遇到的问题。不过我最终错误发现跟soapserver传输的数据量的大小有关系(不知道这个描述是否恰当)。当我从数据库取10条数据,那么就可以很容易的使用soapclient获取到数据,但是当我从数据库里查询1000条数据的时候就会报错了(“Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in……”)!如果我直接运行person.class.php程序是可以显示完整的xml文档的。这根服务器的环境配置会有关系吗?我对于soap认识并不深,也只是现学现卖。希望有经验的前辈们可以指点一二。多谢了!
以下是我的程序代码:

<?php //person.class.php文件
class person
{
	 public function getInfo()
	 {
	 	$strGetList = 'SELECT * FROM information LIMIT 100';
	 	$GLOBALS['le']->query($strGetList);
	 	$results = array();
	 	$xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
	 	$xmlString .="<data>\n";
	 	while( $rows = $GLOBALS['le']->fetch_assoc() ) {
	 		$results[] = $rows;
	 	}
	 	foreach($results as $key=>$val) {
	 		$xmlString .="<rec id="UU{$key}">\n";
	 		foreach($val as $k=>$v ) {
	 			if(strlen($v)>0) {
	 				$v = htmlspecialchars($v);
		 			$xmlString .=" <uu>$v</uu>{$k}>\n";
		 		}
	 		}
	 		$xmlString .="</rec>\n";
	 	}
	 	$xmlString .="</data>\n";
	 	return $xmlString;
	 }
}
//$p = new person;
//echo $p->getInfo();//经测试xml中可以显示所有数据

--- 分割线 ---

<?php //server.php文件
include("person.class.php");
$server = new SoapServer(null,array('uri'=>'abcd','encoding'=>'UTF-8'));
$server->setClass('person');
$server->handle();

--- 分割线 ---

<?php //client.php文件
try{
	$soap = new SoapClient(null,array(
		'location'=>'http://192.168.1.126:102/server.php',
		'uri'=>'abcd',
 		'encoding' => 'UTF-8',
	));
	$s1 =$soap->__soapCall('getInfo',array());
	echo $s1;
} catch(Exction $e) {
	echo $e->getMessage();
}

从SoapClient的异常"[Client] looks like we got no XML document"来看应该是响应有问题,所以首要的是查看响应消息是什么,有几种方案可以协助你定位问题:

  1. 简单一点的,你可以用SoapUI,查看响应是否真的有问题?是否没有响应?
  2. Geek一点的,自制一个模拟客户端来检查响应消息,普通的SOAP协议并不难,只需用HTTP协议POST一小段XML给Server就行,代码量应该在20行以内
  3. 我平时常用一点的,因为SOAP是走HTTP传输协议的,因此可以抓取整个HTTP Response,检查其内容是否符合XML格式。抓取方式可以用tcpdump(Linux命令行)或HTTPTracer(Java跨平台,使用方便,我的最爱)
  4. 直接一点的,查看SoapClient.php的源码,我没记错的话代码量挺小的,查找字符串“looks like we got no XML document”,然后往回找到XML解析那段,在解析前输出原始内容看看到底响应内容出现了什么问题

别用soap,把接口发给你的数据dump出来看看。估计是网络传输出了啥问题,数据没抓全,xml不完整,没法解析。

你问题解决了吗?求指导

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn