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也应该很容易,不过我不懂。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。