2 lbp608 lbp608 于 2014.05.17 16:26 提问

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!';
    }
 ?> 

3个回答

fuyuwenqaz
fuyuwenqaz   2014.12.25 20:04

你去网上下载一个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目录拷贝到
ThinkPHP\Extend\Vendor目录下:
ThinkPHP\Extend\Vendor\soap

然后在在你的项目目录里就可以使用了:
调用方法:
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);
*/
我的项目是:
wservice\wservice\Common
注意: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);
}

我这样是可以正常使用的

fuyuwenqaz
fuyuwenqaz   2014.12.25 20:03

你去网上下载一个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目录拷贝到
ThinkPHP\Extend\Vendor目录下:
ThinkPHP\Extend\Vendor\soap

然后在在你的项目目录里就可以使用了:
调用方法:
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);
*/
我的项目是:
wservice\wservice\Common
注意: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);
}

我这样是可以正常使用的

fuyuwenqaz
fuyuwenqaz   2014.12.25 20:13

如果你还没有搞定你可下载我的看看
http://download.csdn.net/detail/fuyuwenqaz/8300313

Csdn user default icon
上传中...
上传图片
插入图片