查看文章 |
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; } |
最近读者:

