共1页 第1页 懒人懒办法,做个简单的PHP-WSDL-Webservice脚本
圆满解决PHP对WSDL的支持以后,发现写WSDL的函数啥的还是很麻烦,尤其是想把原来做的一大堆non-WSDL模式的函数迁移过来时,遇到困难了。
首先是原来的资源都是以独立函数的形式存在的,而WSDL脚本要求要放在类里,PHP在定义类的时候不允许用include加入方法定义:比如这样的写法就是非法的:
class x { include("funcs.php"); }
后来想把所有函数重新拷贝粘贴进来,这也不对,一是将来代码升级的时候就会混乱了,二是这些函数之间互相调用也会出问题,以前a函数调用b函数直接写b()就可以了,现在要写$this->b(),兼容性还是有很大的问题的。
其次原来图省事,在non-WSDL里面都是用的GBK编码,特别是在encoding选项写好的,但是WSDL全部要求utf-8,所以每次调用都要求编码转换也是不现实的,该函数吧,还想继续兼容原来的non-WSDL模式。
阅读次数:8443 2011-2-26 18:55@0
续1
续写:懒人懒办法,做个简单的PHP-WSDL-Webservice脚本
后来想到了一个办法,何不写个包装类,类里写个方法,不管调用哪个函数,都通过这个方法把编码格式转换后,在从该方法里调用具体的函数,然后把这个类发布到WSDL中。比如原来有函数a和b
functiion a($x,$y){ }
functiion b($x,$y){ }
在下面写一个类
class x {
function callfunc($fname,$arg)
{....}
在类x的方法callfunc中用call_user_func_array($func_name,$vars)去调用函数a或者b
由于callfunc方法得到的参数都是UTF-8的,于是在调用前用iconv先将参数都转换成GBK,调用结束后再用iconv把GBK转换回UTF-8再返回。
这样圆满解决的函数的兼容性和调用问题,只是在调用时要注意调用方法变了,比如以前调用add(1,2)的做法应该是
callfunc('add','1,2')
不过只要约定就好,而且以后增加函数啥的也不用再要求服务器端和客户端刷新WSDL缓存了。 2011-2-26 19:03@0
续2
兼容两种模式的函数写法
在改造原来non-WSDL模式的PHP源码时,遇到了两种情况,以前的函数定义有些是include的外部文件,这还好点,在新的支持wsdl模式的源文件里照样include进来就是了,但是另外一些是和$server->handle()写在一起的。这就需要在原来的脚本里加个标记:
function a(...) {...}
...
if ($wsdl_tag!=1) {
argu=array('uri' =>'shangdu','encoding'=>'gbk');
$server = new SoapServer(null, $argu);
$server->addFunction('a');
$server->handle(); }
在新的支持wsdl的服务脚本里面这样写
$wsdl_tag=1;include ("原来的脚本.php");
下面才继续其他语句。 2011-2-26 19:10@0
续3
发现还有更好的偷懒办法
为了更省事,干脆在服务器端把生成WSDL的类代码整到一起,客户端也写个包装类,把编码转换、函数调用等形式统一处理:
http://www.huliang.com/test/wsdlclass.zip
在服务器端提供wsdl的脚本直接定义完所有函数后
include("wsdlinit.php");
就可以了,为了便于灵活操作访问,我定制了数组$no_func来禁止那些函数被远端调用,这样写
$no_func=array('add','sub');include("wsdlinit.php");
这样add()和sub()两个函数就不能被调用了。
客户端访问的时候更简单了:
在客户端脚本中加入
include("wsdlclient.php");
$soap=new wsdl_client(http://xx.xx.xx.....?wsdl);
就可以直接使用Webservice中定义的函数了。
调用时也很简单,用
$soap->add(1,2)
这样的方式就可以了。编码方式也放心地用gbk,没有一点问题了。
注意由于我用了一些比较新的函数和类的特性,我这两个脚本应该至少要在PHP5.2以上版本运行的,我测试的环境是PHP5.2.6和PHP5.2.9。
2011-2-26 19:55:46编辑 2011-2-26 19:20@0 共1页 第1页 评论:
短信评论请编辑PL2312+空格+内容发送到037160599922
河南联通用户可直接编辑评论内容发送到10656006002112312
以上短信端口不另收取信息费。
发表评论:
|