SOAP: Uncaught SoapFault exception以及 XML error parsing WSDL from

上周上头交代要写个nusoap接口,以前没搞过,如是在网上搜索相关的教程,发现了一篇



2.1 一个简单的例子: Hello World
这个例子将利用 NuSOAP 创建一个简单的 WEB 服务,并利用 NuSOAP 创建一个客户端程序,调用这个服务这个服务唯一的功能就是向客户端返回一个字符串 Hello World 首先,创建 WEB 服务程序代码文件 /nusoap/nusoap_server1.php :
//把 NuSOAP 的源文件包含到当前的代码文件里
<?php
require_once("lib/nusoap.php");
//定义服务程序
function hello() {
return 'Hello World!';
}
//初始化服务对象 , 这个对象是类 soap_server 的一个实例
$soap = new soap_server; //调用服务对象的 register 方法注册需要被客户端访问的程序
//只有注册过的程序,才能被远程客户端访问到
$soap->register('hello'); //最后一步,把客户端通过 post 方式提交的数据,传递给服务对象的 service 方法
//service 方法处理输入的数据,调用相应的函数或方法,并且生成正确的反馈,传回给客户端
$soap->service($HTTP_RAW_POST_DATA);
?> 至此, WEB 服务程序代码文件已经建好,接下来,创建一个客户端程序代码文件 /nusoap/nusoap_client1.php ,调用 WEB 服务:
//把 NuSOAP 的源文件包含到当前的代码文件里
<?php
require_once("lib/nusoap.php");
//初始化客户端对象,这个对象是类 soapclient 的一个实例,
//把服务程序的 URL 地址传递给soapclient类的构造函数
$client = new soapclient('http://127.0.0.1/nusoap/nusoap_server1.php'); //利用客户端对象的 call 方法调用 WEB 服务的程序
$str=$client->call('hello'); //客户端对象的 getError() 方法可以用来检查调用过程是否出现错误
//如果没有错误, getError() 方法返回 false ;如果有错误, getError()方法返回错误信息
if (!$err=$client->getError()) {
echo " 程序返回 :",htmlentities($str,ENT_QUOTES);
} else {
echo " 错误 :",htmlentities($err,ENT_QUOTES);
}
?> 至此,客户端程序也建立好了,打开浏览器,访问客户端程序,看一下结果这个例子,浏览器会显示字符串:程序返回 :Hello World!

运行了下,可是显示的却是

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://127.0.0.1/20121008/helloServer.php' : Extra content at the end of the document in D:\www\helloClient.php:5 Stack trace: #0 D:\www\helloClient.php(5): SoapClient->SoapClient('http://127.0.0....') #1 {main} thrown in D:\www\helloClient.php on line 5

我就纳闷了,我是按代码原样来的啊,怎么会错的呢,于是我把那个soapclient类在nusoap.php中搜了搜,发现了
if (!extension_loaded('soap')) {
	/**
	 *	For backwards compatiblity, define soapclient unless the PHP SOAP extension is loaded.
	 */
	class soapclient extends nusoap_client {
	}
}

原来是继承自nusoap_client,于是替换了下就显示ok了。补充下,这里替换的意思是实例化时直接new nusoap_client(),表示有些朋友没看明白。


之后,又参照下面的wdsl做了实例,下面是helloServer.php

include_once('./nusoap.php');

function searchInfo($sdate,$edate,$caller='',$rece='')
{
    $tempYear = substr($sdate,0,4);
    $tempMonth = substr($sdate,4,2);
    $tempDay = substr($sdate,6,2);
    $sdate = mktime(0,0,0,$tempMonth,$tempDay,$tempYear);
   
    $tempYear = substr($edate,0,4);
    $tempMonth = substr($edate,4,2);
    $tempDay = substr($edate,6,2);
    $edate = mktime(0,0,0,$tempMonth,$tempDay,$tempYear);

    //$data = `sudo /usr/local/www/www/scripts/www-sms queryRecord_ "1349884800:1350662399::"`;
    return 'good ddd morning'; //这里应该没有问题,我改为1了,显示的结果还是标题上提示的
}
//"$sdate:$edate:$caller:$rece"
$soap = new soap_server();

$soap->configureWSDL('www','urn:www'); 

$soap->register('searchInfo',
                array('sdate'=>'xsd:string','edate'=>'xsd:string','caller'=>'xsd:string','rece'=>'xsd:string'),
                array('return'=>'xsd:string'),
                'urn:www',
                'urn:www#searchInfo'
                );

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

下面是helloClient.php

include_once('./20121008/nusoap.php');
$client = new nusoap_client('http://127.0.0.1/20121008/helloServer.php/wsdl',true);


$data = $client->call('searchInfo',array('sdate'=>'','edate'=>'','caller'=>'','rece'=>''));

if(($err = $client->getError())) {
    echo '错误为:',$err;
} else {
    echo $data;
}

运行helloClient.php之后,页面显示的‘错误为:wsdl error: XML error parsing WSDL from http://127.0.0.1/20121008/helloServer.php/wsdl on line 77: Attribute without value’,可是我再运行helloServer.php时一切都正常,我就纳闷了,又回到helloClient.php上,仔细看了下,又对着网上的资料,找到了答案
$client = new nusoap_client('http://127.0.0.1/20121008/helloServer.php/wsdl',true);
改为
$client = new nusoap_client('http://127.0.0.1/20121008/helloServer.php?wsdl',true);
也就是wsdl前不是斜杆,而是问好
运行之后,终于返回了梦寐以求的答案good ddd morning


感慨一下,发现国内有关这方面的资料好少,在google时,大部分都是英文,弄完之后,害的我眼睛疼,肚子里的英文就被榨干了,还是不行,最后只得用翻译软件了,汗!希望以后遇到的朋友能少走弯路吧!


新增

今天在调试接口的时候,发现页面上有'???'乱码,我就纳闷了,以前没有发现,怎么今天就有了呢。于是在网上一顿找,先是用iconv函数,可是却木有达到效果,后来发现了正主,只需在客户端加入两段代码即可

$client->soap_defencoding   =   'UTF-8'; 
$client->decode_utf8   =   false;

新增

知识真的是日积月累的,今天又碰到一个问题,php调用好好的,可到.net那确实字符类型不匹配,php这边的xml是‘ISO-8859-1’,可以.net要utf-8的,后来又是在网上找了下,发现,只需在nusoap.php源文件中

//var $soap_defencoding = 'ISO-8859-1';
	var $soap_defencoding = 'UTF-8';

把上面的注释掉,使用下面的即可。


你可能感兴趣的:(exception,server,SOAP,extension,Parsing)