0、NuSOAP的简介

NuSOAP 是一组功能强大的PHP类,这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写,可以无缝的与许多最流行的SOAP服务实现交互,它以LGPL协议进行发布。NuSOAP的主要特性包括:

简单:NuSOAP的面向对象方法隐藏了SOAP消息的组装、解析、提交和接收的有关细节,是用户能够集中精力处理自己的业务。

WSDL的生成和导入:NoSOAP可以生成一个对应于所发布的Web服务的WSDL文档,并且能导入一个WSDL引用在NuSOAP客户端使用。

代理类:NuSOAP可以生成的一个代理类,允许调用远程方法,如同调用本地方法一样。

HTTP代理:出于多种原因(安全性和审计是其中两个原因),有些客户端被强制将请求委托给HTTP代理,由代理代表客户端执行请求。也就是说,需要所有SOAP请求都传递给此代理,而不是直接查询服务器。NuSOAP为指定代理服务器提供了基本支持。

SSL:如果可以通过PHP使用CURL扩展,NuSOAP还支持通过SSL的安全通信。

1、Nusoap的获取安装

NuSOAP是一组PHP类,只要从SourceForge下载源码后,放入自己的工程目录引用,就可以使用。当然,NuSOAP库的存放位置可以自由决定,include目录、工程目录或者任何能够访问到的位置。

2、NuSOAP的使用

要使用NuSOAP,我觉得需要要对于SOAP有些基础得了解,附录中的参考资料我们可以了解到一些知识,从下面的图片,也可以了解到SOAP在Web服务堆栈中的地位。

使用SOAP时,有客户端和服务器两种情况。具体的使用比较简单,以至于NuSOAP官方都没有什么文档来说明,也许作者觉得不需要说明吧。下面就结合CodeIgniter框架,来说明NuSOAP的使用。

PS:需要说明的一点,NuSOAP不能和PHP的SOAP扩展同时使用,如果你的LAMP环境中安装了SOAP的扩展,那么NuSOAP直接是不能用的,因为类名重复的,如果花些力气把名字改下,也可以使用 :)

3、CI中使用Nusoap的方法

CI中调用第三方的类库,如果简单的调用,则非常的简单。一般的做法是将NuSOAP放在application/libraries 下面,然后编写一个引用这些文件的类,如 Nusoap_lib.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Nusoap_lib {
    function __construct(){
        $library_path = '/home/apache/htdocs/libraries/';
        $nusoap = $library_path . 'nusoap0.9.5/nusoap.php';

require_once $nusoap;
    }
}

?>

这样,我们就可以在其他的文件中通过CI常规的加载的方式来调用 NuSOAP 进行使用,比如在一个 Client类中。

$this->load->library('Nusoap_lib');

$api_url = "http://app.x.com/webservicefordiscuz/Service.asmx";
$this->nusoap_client = new SoapClient( $api_url );
$this->nusoap_client->soap_defencoding = 'utf-8';
$this->nusoap_client->decode_utf8 = false;
$this->nusoap_client->xml_encoding = 'utf-8';

$err = $this->nusoap_client->getError();

if( $err ){
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
    exit();
}else{

}

try{
    $result = $this->nusoap_client->call(
        'CheckExistUser',
        array('username' => "$username"),
        '',
        'http://app.x.com/webserviceForDiscuz/CheckExistUser'
    );

print_r( $result );
    echo "<br />";
    echo '<p>Request:<br />';
    echo '<pre>',htmlspecialchars($this->nusoap_client->request,ENT_QUOTES),'</pre>';
    echo '<br />Response:<br />';
    echo '<pre>',htmlspecialchars($this->nusoap_client->response,ENT_QUOTES ),'</pre></p>';
    echo "<br />";
    print_r( $this->nusoap_client );
}catch(Exception $e){
    echo $e->getMessage();
}

事实上,在CI中使用NuSOAP,最大的挑战不在于如何引入。而在于理解并使用NuSOAP,我们照着参考资料1中的例子,一步步也能做出一个SOAP应用,但是却不是十分理解为什么要这样做,以及SOAP的具体通信和实现方式是怎么样的。建议感兴趣的同学可以看看IBM Developer Works中关于SOAP的介绍,相信对于SOAP的理解和今后的使用会有很大帮助。

下面,是我自己试验的过程中的两个例子,希望对大家有所帮助。

服务端

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Server extends Controller{
    function __construct(){
        parent::__construct();
        $this->load->library('Nusoap_lib');

$this->nusoap_server = new soap_server();
        $this->nusoap_server->register(
            'hello',
            array(
                'name' => 'xsd:string'
            ),
            array('return'=>'xsd:string'),
            'uri:soap/server',
            'uri:soap/server/hello',
            'rpc',
            'encoded'
        );
    }

function index(){
        if($this->uri->segment(3) == "wsdl"){
            $_SERVER['QUERY_STRING'] = "wsdl";
        }else{
            $_SERVER['QUERY_STRING'] = "";
        }
        function hello($name){
            return "Hello $name.";
        }
        $this->nusoap_server->service( file_get_contents('php://input') );
        exit;
    }
}
?>

客户端

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Client extends Controller{
    function __construct(){
        parent::__construct();
        $this->load->library('Nusoap_lib');
    }

function index(){
        $this->nusoap_client = new SoapClient('http://mti.x.com/soap/server');
//        $this->nusoap_client->soap_defencoding = 'utf-8';
//        $this->nusoap_client->decode_utf8 = false;
//        $this->nusoap_client->xml_encoding = 'utf-8';

$err = $this->nusoap_client->getError();
        if( $err ){
            echo '<p><b>Constructor error:' . $err . '</b></p>';
        }
        $result = $this->nusoap_client->call(
            'hello',
            array('name'=>'World'),
            'uri:soap/server',
            'uri:soap/server/helo' );

if( $this->nusoap_client->fault ){
            echo '<p><b>Fault:';
            print_r( $result );
            echo '</b></p>';
        }else{
            print_r( $result );
        }

echo "<br />";
        echo '<p>Request:<br />';
        echo '<pre>',htmlspecialchars($this->nusoap_client->request,ENT_QUOTES),'</pre>';
        echo '<br />Response:<br />';
        echo '<pre>',htmlspecialchars($this->nusoap_client->response,ENT_QUOTES ),'</pre></p>';
        echo "<br />";

// Display the debug messages
        echo '<h2>Debug</h2>';
        echo '<pre>' . htmlspecialchars($this->nusoap_client->debug_str, ENT_QUOTES) . '</pre>';
    }

}

4、常见问题

调试的三个方法:1、使用->request,->response查看消息头;2、使用日志查看调试信息;3、使用错误信息捕捉。

Technorati 标签: SOAP,NuSOAP,PHP,WSDL

参考资料:
1、Nusoap in Code Igniter 1.5.4
2、CI Nusoap Library
3、浅谈SOAP
4、WSDL:描述你的Web服务
5、NuSoap的使用
6、Introduction to NuSOAP

在Codeigniter框架中使用NuSOAP相关推荐

  1. ***PHP中error_reporting()用法详解(含codeigniter框架中屏蔽错误提示的解决方案)

    php中我们对错误的处理会常用到error_reporting函数了,大家可以看到最多的是error_reporting(E_ALL ^ E_NOTICE)了,这个到底什么意思呢,下面我来来看看. e ...

  2. php ci rest,在CodeIgniter框架中使用RESTful服务

    步骤3 分析example_api.php 接下来,我们打开application/controllers/example_api.php文件,仔细分析其代码. 首先,在CodeIgniter中,我们 ...

  3. php框架 postgresql,CodeIgniter框架中使用PostgreSQL的配置

    近日,因参与PostgresQL中国开源网站的建设,使用了CodeIgniter这个PHP的框架,相对还是算简单的,不过其文档中只给了使用mysql数据库的配置,而我们需使用PostgreSQL,特此 ...

  4. ci php做记录删除,CI(CodeIgniter)框架中的增删改查操作_PHP教程

    CodeIgniter的数据函数类在 \system\database\DB_active_rec.php 代码如下: class ModelName extends CI_Model { funct ...

  5. php的CodeIgniter框架中如何过滤数据(将危险数据如html类型的数据过滤后提交到数据库)...

    1.可以选择使用htmlspecialchars()方法过滤. 2.可以将config文件夹下面的config.php文件中的$config['global_xss_filtering'] = FAL ...

  6. ci mysql 转义,CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析

    本文实例分析了CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患.分享给大家供大家参考,具体如下: php CI框架中URL特殊字符有很多是不支持的,导致像c++,括号这些常用的分 ...

  7. **【ci框架】精通CodeIgniter框架

    http://blog.csdn.net/yanhui_wei/article/details/25803945 一.大纲 [php] view plaincopy 1.codeigniter框架的授 ...

  8. ci mysql 缓存_CodeIgniter框架中启用和清除缓存的教程

    CodeIgniter框架启动与缓存问题许多的新手都不知道如何来操作了,下面我们就一起来看一篇关于CodeIgniter框架中启用和清除缓存例子,具体如下所示. Codeigniter支持缓存技术,以 ...

  9. 使用 CodeIgniter 框架快速开发 PHP 应用(二)

    使用 CodeIgniter 框架快速开发 PHP 应用(二) 原文:使用 CodeIgniter 框架快速开发 PHP 应用(二) 二分钟: 建立一个 CodeIgniter 网站 用CI建一个网站 ...

最新文章

  1. jwt获取token_SpringBoot2 高级案例(09): 整合 JWT 框架,解决Token跨域验证问题
  2. FFT镜头效果的新进展
  3. visio2007 画流程图杂记
  4. 虚拟机在安装svn时 认证密码一直报错_研路同行|安装虚拟机到安装GAMIT教程步骤汇总...
  5. SQLServer数据库的备份/恢复的3中策略实例
  6. 数据分析:构建可视化报表服务
  7. 正则满足中文的顿号_常用的正则表达式、正则表达式之断言
  8. 线下活动 | 揭秘大数据背后的京东虚拟平台(免费报名中)
  9. 计算机管理器磁盘清理,修复win7提示“windows磁盘空间清理管理器已停止工作”的方法...
  10. 增删改查通用测试用例-禅道模板
  11. 求解集合A与B的差集
  12. 简单干净的C#方法设计案例:SFCUI.AjaxValue()之一
  13. 关于《PHP任务学习》的说明
  14. 动态ARP检测,引发上网断断续续
  15. 深度学习:卷积神经网络之移动网络(MobileNet)
  16. WPF 第三方控件学习使用——可停靠布局控件(AvalonDock)
  17. Yate for Mac(音乐标签管理工具)
  18. 【胡侃系列】基于多元回归模型的双十一购物狂欢节天猫商城销售额预测
  19. 使用certbot openresty执行获取 Let’s Encrypt https 免费证书
  20. 联想台式电脑一键恢复后桌面没有计算机了,联想笔记本一键恢复功能使用教程...

热门文章

  1. linux目录操作函数
  2. mysql 学习笔记03修改表以及其他操作
  3. 每日一题:leetcode456.132模式
  4. 函数指针指向类的静态成员函数
  5. 【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践
  6. truncate、rename函数的使用
  7. 阿里P7亲自教你!我的头条面试经历分享,完整PDF
  8. 全局变量_Python函数中的全局变量与局部变量
  9. Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑(转载)
  10. 为什么直接ping知乎的ip不能访问知乎的网站,而百度就可以?