在Codeigniter框架中使用NuSOAP

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服务堆栈中的地位。

ws-03.gif

使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 你有使用过loadable组件吗?它帮我们解决了什么问题?

[react] 你有使用过loadable组件吗&#xff1f;它帮我们解决了什么问题&#xff1f; 目前有两个 react-loadable和 loadable component&#xff0c;用于代码分割&#xff0c;解决打包体积过大的问题 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

JAVA运行程序代码段

我记得那时候刚毕业。学习JAVA恐惧是这里&#xff0c;它是关于JAVA称号。我总是不正确。如今&#xff0c;这最后审查。看了好半天。得赶紧把刚才学习到的那点东西记下来。 一、关于static的代码段运行顺序 运行结果例如以下&#xff1a; Inside main() Mug(1) Mug(2) c1 & …

Keil使用PC-Lint

Keil使用PC-Lint 随着项目的推进与迭代&#xff0c;一个Project的代码量往往会不知不觉增长&#xff0c;当项目代码达到数万行&#xff0c;迭代经历较长时间后&#xff0c;仅靠开发人员自身的代码质量已不能满足对整体质量的把控。难以避免会出现一些潜在的逻辑错误与非逻辑错误…

我的网页设计(网页页面制作二)

嵌入网页页面制作出自个人的爱好&#xff0c;利用代码的编写融入产生web网页页面的应用效果&#xff0c;来进行页面的选择、搜索。这样可以大大的提高了参考者、浏览者的个人不同需要&#xff0c;从而也了解了对网页页面制作扩大范围和空间。也可以转换对网页页面字体产生文字体…

警告warning: strncpy specified bound XX equals destination size

1、问题 用strncpy字符串拷贝时&#xff0c;出现警告&#xff1a;warning: strncpy specified bound 32 equals destination size [-Wstringop-truncation]。 2、解决&#xff1a;strncpy不拷贝最后一个字节&#xff0c;手动给它赋值\0。 例子&#xff1a; #define SIZE 20…

ShellExecute 函数的用法和实例

From: http://blog.sina.com.cn/s/blog_49364213010003d8.html 今天帮同学做毕业设计时&#xff0c;用到了ShellExecute 函数&#xff0c;在这写一下。关于ShellExecute函数&#xff1a;在ShellAPI单元中&#xff0c;ShellExecute函数的定义为&#xff1a;HINSTANCE ShellExec…

[React]你有用过哪些React的表单库吗?说说它们的优缺点

[React]你有用过哪些React的表单库吗&#xff1f;说说它们的优缺点 redux-formreact-jsonschema-formformikunform 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题…

嵌入式产品开发流程

嵌入式产品&#xff0c;与普通电子产品一样&#xff0c;开发过程都需要遵循一些基本的流程&#xff0c;都是一个从需求分析到总体设计&#xff0c;详细设计到最后产品完成的过程。但是&#xff0c;与普通电子产品相比&#xff0c;嵌入式产品的开发流程又有其特殊之处。它包含嵌…

Codeforces 478B 6thweek contest_B

Random teams 题意&#xff1a; 有n个选手和m个队伍&#xff0c;让你分配&#xff0c;条件是每个队伍至少要有1个选手。分配完之后&#xff0c;每队伍里2个人可以组成一组&#xff0c;求分配完之后最多的组数和最少的组数 分析&#xff1a; 1. 最多的情况就是&#xff0c;先每…

apache代理IIS的80端口实现共存

IIS与apache共用80端口方法&#xff1a; 一&#xff1a;如何有多的公网IP。可在一个网卡上绑定多个IP来实现。 IIS6&#xff0c;多IP下共存&#xff0c;IIS为192.168.0.1&#xff0c;apache为192.168.0.2 原文地址到2003的CD下的 support/tools/Support.cab。解压出httpcfg.exe…

[react] 你有使用过formik库吗?说说它的优缺点

[react] 你有使用过formik库吗&#xff1f;说说它的优缺点 Formik提供了便捷的表单操作&#xff0c; 如获取表单数据&#xff0c;表单校验&#xff0c;提交事件等 结合yup来设置表单校验规则非常方便 Formik is a small library that helps you with the 3 most annoying par…

Linux 多线程开发-线程创建pthread_creat

1、函数原型 int pthread_creat(pthread_t *pid, const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg); pid&#xff1a;返回创建成功后的线程ID&#xff0c;unsigned int型变量&#xff1b;attr&#xff1a;设置线程属性&#xff0c;为NULL则为默认属性&…

Eclipse的maven插件最新地址

最新地址&#xff1a;http://download.eclipse.org/technology/m2e/releases 原先&#xff1a;http://m2eclipse.sonatype.org/sites/m2e转载于:https://www.cnblogs.com/binarysheep/p/4752793.html

USB大全

http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html

[react] 怎样动态导入组件?

[react] 怎样动态导入组件&#xff1f; 自己使用 import 和 async/await 实现的异步组件React.lazy开源库 react-loadable 库/react-lazyload 库babel 动态导入&#xff08;Dynamic Import&#xff09; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

/dev/fb0入门练习

From: http://sunnyshineboy.blog.163.com/blog/static/20281511820124121118700/ 大家都知道Unix/Linux系统是由命令驱动的。那么最基本的系统是命令行的&#xff08;就是想DOS一样的界面&#xff09;。X&#xff0d;Window&#xff0d;System是Unix/Linux上的图形系统&…

Linux 多线程开发-等待线程结束pthread_join

1、函数原型 int pthread_join(pthread_t pid, void **value_ptr); pid&#xff1a;所等待的线程ID&#xff1b;value_ptr&#xff1a;通常设置为NULL&#xff0c;如果不为NULL&#xff0c;pthread_join将复制一份线程退出值到一个内存区域&#xff0c;并让*value_ptr指向该内…

SQL常用语句|创建表,设置主键......

新建表 create table [表名]([自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,[字段1] nVarChar(50) default \默认值\ null ,[字段2] ntext null ,[字段3] datetime,[字段4] money null ,[字段5] int default 0,[字段6] Decimal (12,4) default 0,[字段7] image null ,) 删除…

如何Keil官网下载器件支持包Software Packs

步骤1&#xff1a;百度一下Keil&#xff0c;在搜索结果中点击打开官网 步骤2&#xff1a;在官网的搜索栏输入Software Packs&#xff0c;点击Go 步骤3&#xff1a;点击打开MDK Software Packs 步骤4&#xff1a;往下拉&#xff0c;找到自己需要的Pack 步骤5&#xff1a;以下载s…

为文档快速插入页眉和页脚

专业的文档往往需要配以漂亮的页眉、页脚等修饰性元素才会更加完美。在Word 2010中您不必再为设计漂亮页眉和页脚而大费周折&#xff0c;内置的“页眉样式库”和“页脚样式库”为您提供了丰富的选择余地。 &#xff08;1&#xff09;打开Word 2010文档&#xff0c;在“插入”选…