SOAP: java+xfire(web service) + php客户端

作者: 吴俊杰

web service这项技术暂不说它有多落伍,但是项目中用到了,没法逃避!
    xml和json各有各的好处,但是JSON无疑是当今数据交互的主流了。客户soap服务器端用的是 java+xfire开发的,而我不懂java,可是我和客户的程序有数据交互,起初我推荐用json数据格式,但是客户执意要用web service。拗不过,只有研究 php的soap了。
    事实证明:这可不是一件容易的事情,web service虽号称 “跨平台与开发语言无关” ,实则是机关重重,陷阱遍布!网上的参考资料凌乱不堪,去糟存精也绝非易事,调通这个确实是走了不少弯路,在没有人指导的情况下,一直在网上search,一路之艰辛实属不易!下面就就记录一下php和java+xfire互为 web service服务器之间的一些细节,防止再次用到的时候,又走弯路,浪费时间。

 

1)普及知识php的soap类库
参考:http://www.cnblogs.com/chance1/archive/2009/04/08/1431949.html

php有两个扩展可以实现web service,一个是NuSoap,另一个是php官方的soap扩展,由于soap是官方的,所以我们这里以soap来实现web service.由于默认是没有打开soap扩展的,所以自己先看一下soap扩展有没有打开。

在soap编写web service的过程中主要用到了SoapClient,SoapServer,SoapFault三个类。

SoapClient类
这个类用来使用Web services。SoapClient类可以作为给定Web services的客户端。
它有两种操作形式:
* WSDL 模式

* Non-WSDL 模式

在WSDL模式中,构造器可以使用WSDL文件名作为参数,并从WSDL中提取服务所使用的信息。

non-WSDL模式中使用参数来传递要使用的信息。

SoapServer类
这个类可以用来提供Web services。与SoapClient类似,SoapServer也有两种操作模式:WSDL模式和non-WSDL模式。这两种模式的意义跟 SoapClient的两种模式一样。在WSDL模式中,服务实现了WSDL提供的接口;在non-WSDL模式中,参数被用来管理服务的行为。
在SoapServer类的众多方法中,有三个方法比较重要。它们是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。 

下面给出实例
定义一个提供服务的php类,这个类所提供的函数就是web service对外提供的服务
(比较简单,例子略)

注意事项(非常重要)
php自带的soap扩展提供的类或构造函数是:SoapClient::SoapClient,详见《php5参考手册》 ;而nusoap提供的类库是:nusoap_client(有下划线) ,详见nusoap安装包源文件“lib/class.soapclient.php”文件。这里你会觉得很奇怪,为什么文件名不是带下划线"class.soap_client.php"?原来是这样的,nusoap为了兼容php自带的扩展soap的代码,在此类库文件最后面一行有如下代码:

if (!extension_loaded(‘soap‘)) {
class soapclient extends nusoap_client {
}
}
所以网上就出现了乱七八糟的 用第三方nusoap类库初始化soap客户端对象的例子,但是运行的时候程序都没有报错!例如:有的代码是 $client=new soapclient(); 有的是 $client = new nusoap_client(); 就是上面的原因!不过这里要说明的是,php扩展自带的soap类,已经能够很好的处理soap客户端调用,但是它的弊端就是如果它作为soap server要生成web service的WSDL,就显得无能为力了。而第三方的nusoap却恰好很容易生成WSDL。所以我这个项目就把两者都利用上了。【重要】为了不至于造成类库冲突,我还是修改了nusoap的 class.soapclient.php 文件的代码,把最后面的:
if (!extension_loaded(‘soap‘)) {
class soapclient extends nusoap_client {
}
}
删掉了。那么我打算这样,事实上也是尝试了很多方法都不行而被逼成这样的: php自带的soap扩展nusoap第三方类库必须在我的业务系统上共存兼容;我的业务系统(php代码实现)既是soap服务器端,也是soap客户端。我用nusoap作为我的soap server,因为客户的java机器要用web service调用我提供给它的函数,而且我要生成WDSL;而我的php脚本也要作为soap客户端调用客户java服务器上的函数的时候,不得不用php扩展自带soapclient这个类,至少我测试nusoap做soap client就是没法实现,soapclient这个自带的类库,也是侥幸可以调用

 

==============================================================================

2) 同种语言的 web service 服务器端和客户端
使用php soap扩展 建立 soap server和用soap client调用soap server 提供的函数非常简单,不用举例了。同理如果用java实现soap也应该很容易,不过我不懂。

SOAP: java+xfire(web service) + php客户端,布布扣,bubuko.com

SOAP: java+xfire(web service) + php客户端

上一篇:asp.net mvc2+nhibernate实体类映射问题之“尝试创建Controller类型的控制器时出错请确保控制器具有无参数公共构造函数”


下一篇:高手总结CSS书写技巧