返回主页



狐说西游



掩码计算



分数引擎



蓍草算法



386YAO



15TO18



PHP手册



画二维码



共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
以上短信端口不另收取信息费。

发表评论:
昵称: 密码:请用商都BBS账户登录
评论:
验证码:

附近BLOG

1:[围脖]其实提前到除夕放假真的亏了一天……

2:[新浪围脖]卧铺车厢已经黑下来了……

3:[围脖]上班了……

4:[围脖]东风东路上的红绿灯……

5:搞定PHP的WEBservice,尤其是BT的WSDL

now:懒人懒办法,做个简单的PHP-WSDL-Webservice脚本

6:[新浪围脖]不能自动同步了……

7:终于下雪了

8:[围脖]听说新浪的同步接口好了……

9:[围脖]整了个二维码程序……

10:升级PHP到5.3.x,准备开始用PDO和MysqlND连接数据库


© 2025古钺青剑 保留一切权利  并承担一切责任
豫ICP备2020027102号-4号