查看文章
 
php5的SoapClient与nusoap
2008-04-15 17:33
    我以前写过一篇文章介绍了php下建立webservice的几种方法,有介绍了nusoap,在综合比较后没有作为服务端的方案进行使用,在选择调用webservice的client上也选用了php5自带的SoapClient,他的接口确实更好,有点ruby的味道,可以把服务的方法名直接作为SoapClient实例的方法名进行调用,系统自动处理。再加上是官方带的,更严谨,我们就一直采用。
    但是我们使用他前后也发现了不少问题,比如apache里url大小写的处理办法是通过201跳转来实现,所以你的服务的url要是大小写不严谨的话就会告诉你不能connect to host,最BT的是,如果你localhost的解析不对,也会报这个错误,很难排查,最近又经常报HTTP404 Not Found ,找不到服务了,该地址,重启都不好使,搞得偶相当郁闷,就差去改SoapClient的源码了.
    无奈只有用nusoap来代替,好歹人家也是广泛使用的,久经考验,应该没有这些问题,但是用这个东西的话,我就要改调用端的源码,经过尝试也积累了些兼容经验,和大家分享下:

PHP5里的SoapClient:
$this->service = new SoapClient("http://localhost/frontservice/service.php?class=myworkManager&wsdl");
$result = $this->service->getTicket($user,$pwd);
print_r($result->name);


nusoap:
$this->service = new nusoap_client("http://localhost/moas/service.php?class=myworkManager&wsdl",true);    
$this->service->soap_defencoding = 'utf-8';
$this->service->decode_utf8 = false;
$this->service->xml_encoding = 'utf-8';
$params = array("user"=>$user,"pwd"=>$pwd);
$result = $this->array_to_obj($this->service->call("getTicket",$params));
print_r($result->name);


值得注意的是要保持和SoapClient接口一致的话,有几个地方要注意下:
1.nusoap_client的构造函数第二个参数要传递true,以说明访问的是一个wsdl。
2.然后要设置对应的编码,否则容易导致乱码
3在nusoap调用服务调用的时候也只能用call(方法名,参数键值对数组)的方式进行调用,soapclient的参数也是更简单按顺序构造的数组,没有用键值方式。
4.最关键的一点,对于复杂对象nusoap的返回值是一个array,不同于SoapClient的stdObject,为了保持兼容性,搞了一个函数来进行数组和对象的转换,就是上面的array_to_obj ,实现过程如下:
function array_to_obj($array)
        {
            $obj = new stdClass();
            foreach ($array as $key => $value)
            {
                if (is_array($value))
                {
                    $obj->$key = $this->array_to_obj($value);
                   
                }
            else
            {
                $obj->$key = $value;
            }
        }
            return $obj;
        }

类别:Php||添加到搜藏 |分享到i贴吧|浏览(3441)|评论 (0)
 
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu