上周上头交代要写个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
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);
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; }
$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';