问题描述
- ThinkPHP中怎么调用nusoap?
-
项目中需要使用webservice,我们选了nusoap,但是一直无法将ThinkPHP与nusoap这两者结合起来用,求大神帮助。
服务器端:<?php class ServerAction extends Action { public function _initialize() { Vendor('Ns.nusoap'); // 初始化服务对象 , 这个对象是类 soap_server 的一个实例 $soap = new soap_server (); // 调用服务对象的 register 方法注册需要被客户端访问的程序。 // 只有注册过的程序,才能被远程客户端访问到。 $soap->register ( 'hello' ); // 最后一步,把客户端通过 post 方式提交的数据,传递给服务对象的 service 方法。 // service 方法处理输入的数据,调用相应的函数或方法,并且生成正确的反馈,传回给客户端。 $soap->service ( $HTTP_RAW_POST_DATA ); } // 定义服务程序 function hello() { return 'Hello World!'; } } ?>
客户端:
<?php class ClientAction extends Action { public function test() { Vendor('Ns.nusoap'); // 初始化客户端对象,这个对象是类 soapclient 的一个实例, // 把服务程序的 URL 地址传递给soapclient类的构造函数。 $client = new soapclient ( 'http://127.0.0.1/nusoap/Server/' ); // 利用客户端对象的 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 ); } } } ?>
nusoap类库放在ThinkPHP/Extend/Vendor/Ns/下面。
运行客户端报错:错误 :XML error parsing SOAP payload on line 1: Reserved XML Name如果将服务器端代码直接写成一个php文件,不用ThinkPHP就没有问题,如下:
<?php require_once ("../../ns/nusoap.php"); // 初始化服务对象 , 这个对象是类 soap_server 的一个实例 $soap = new soap_server (); // 调用服务对象的 register 方法注册需要被客户端访问的程序。 // 只有注册过的程序,才能被远程客户端访问到。 $soap->register ( 'hello' ); // 最后一步,把客户端通过 post 方式提交的数据,传递给服务对象的 service 方法。 // service 方法处理输入的数据,调用相应的函数或方法,并且生成正确的反馈,传回给客户端。 $soap->service ( $HTTP_RAW_POST_DATA ); // 定义服务程序 function hello() { return 'Hello World!'; } ?>
解决方案
你去网上下载一个soap里面文件有:
class.nusoap_base.php
class.nusoapmime.php
class.soap_fault.php
class.soap_parser.php
class.soap_server.php
class.soap_transport_http.php
class.soap_val.php
class.soapclient.php
class.wsdl.php
class.wsdlcache.php
class.xmlschema.php
class.nusoap.php这个文件默认是nusoap.php改成class.nusoap.php
然后把这个soap目录拷贝到
ThinkPHPExtendVendor目录下:
ThinkPHPExtendVendorsoap
然后在在你的项目目录里就可以使用了:
调用方法:
vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件
$client = new nusoap_client($url. "?WSDL", "wsdl");
/*
@这里是参考使用:
*$client->soap_defencoding = 'utf-8';
*$client->decode_utf8 = false;
*$client->xml_encoding = 'utf-8';
*return $client->call($method, $data);
*/
我的项目是:
wservicewserviceCommon
注意:Common目录是我自己定义的函数库
里面定义了一个common.php文件
下面是我测试用的函数:
/
*测试函数
*/
function test($url,$method,$data){
vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件
$client = new nusoap_client($url. "?WSDL", "wsdl");
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'utf-8';
return $client->call($method, $data);
}
我这样是可以正常使用的
解决方案二:
你去网上下载一个soap里面文件有:
class.nusoap_base.php
class.nusoapmime.php
class.soap_fault.php
class.soap_parser.php
class.soap_server.php
class.soap_transport_http.php
class.soap_val.php
class.soapclient.php
class.wsdl.php
class.wsdlcache.php
class.xmlschema.php
class.nusoap.php这个文件默认是nusoap.php改成class.nusoap.php
然后把这个soap目录拷贝到
ThinkPHPExtendVendor目录下:
ThinkPHPExtendVendorsoap
然后在在你的项目目录里就可以使用了:
调用方法:
vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件
$client = new nusoap_client($url. "?WSDL", "wsdl");
/*
@这里是参考使用:
*$client->soap_defencoding = 'utf-8';
*$client->decode_utf8 = false;
*$client->xml_encoding = 'utf-8';
*return $client->call($method, $data);
*/
我的项目是:
wservicewserviceCommon
注意:Common目录是我自己定义的函数库
里面定义了一个common.php文件
下面是我测试用的函数:
/
*测试函数
*/
function test($url,$method,$data){
vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件
$client = new nusoap_client($url. "?WSDL", "wsdl");
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'utf-8';
return $client->call($method, $data);
}
我这样是可以正常使用的
解决方案三:
如果你还没有搞定你可下载我的看看
http://download.csdn.net/detail/fuyuwenqaz/8300313