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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

【平台】HBase学习总结

HBase的下载与安装 (HBase是一种数据库:Hadoop数据库,它是一种NoSQL存储系统,专门设计用来快速随机读写大规模数据。本文介绍HBase的下...

6587
来自专栏JavaEdge

操作系统之文件管理一、文件与文件系统二、文件控制块和文件目录三、文件的物理结构四、文件系统的实现五、文件系统实例(UNIX)六、UNIX文件系统一、文件系统实例(FAT)二、文件操作的实现三、文件系统

5446
来自专栏张善友的专栏

Redis 起步

Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介 ? Redis是一个key-value...

2008
来自专栏Java3y

从零单排学Redis【黄金】

好的,今天我们要上黄金段位了,如果还没经历过青铜和白银阶段的,可以先去蹭蹭经验再回来:

1272
来自专栏静晴轩

浅谈android中的目录结构

之前在android游戏开发中就遇到本地数据存储的问题:一般情形之下就将动态数据写入SD中存储,在没有SD卡的手机上就需另作处理了;再有在开发android应用...

34610
来自专栏木子昭的博客

精析Python3实现动态web服务(附服务端源码)如果我们提供一个动态网站服务,至少应考虑以下四点:一个优秀的动态web框架应该是这样的:关于WSGI标准WIGS模型的要点:实现源码小结:

实现一个简单的静态web网站,只需将写好的html页面上传到特定的web服务器软件即可,但静态网页其实和图片没什么区别,每次更新网站内容,都需要重新制作htm...

37812
来自专栏喔家ArchiSelf

消息队列在RTOS的应用

传说互联网应用有两大利器,一个是缓存,另一个就是消息队列。 一直相对消息队列做一下梳理,希望早日另有成文。 一叶知秋,实际上消息队列在嵌入式系统中同样有着广泛的...

1073
来自专栏周明礼的专栏

一步一步带你搭建一个“摩登”的前端开发环境

最近几年也陆续推出了多种不同的js类型系统用于增强js的健壮性,其中像 typescript 就是其中的佼佼者。当然我今天要讲的并不是typescript,而是...

1.5K0
来自专栏静默虚空的博客

Eclipse 实用技巧

代码智能提示 Java智能提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Aut...

2127
来自专栏前端杂货铺

Nodejs cluster模块深入探究

由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程、nginx的事件循环等。而对于nod...

55010

扫码关注云+社区

领取腾讯云代金券