麦田的守望者001 2014-05-17 08:26 采纳率: 0%
浏览 4727

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!';
    }
 ?> 
  • 写回答

2条回答

  • fuyuwenqaz 2014-12-25 12: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);
    }

    我这样是可以正常使用的

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧