之前请求通过curl实现了,但是我还是想研究下,为什么PHP原生的soapclient构造出来的请求不行。
通过对比:
1 | echo "请求头:\n" . $client->__getLastRequestHeaders() . "\n" ; |
2 | echo "请求体:\n" . htmlspecialchars_decode($client->__getLastRequest()) . "\n" ; |
3 | echo "返回头:\n" . $client->__getLastResponseHeaders() . "\n" ; |
4 | echo "返回内容:\n" . $client->__getLastResponse() . "\n" ; |
对比这四个值与在soapui中调试请求的内容的对比,发现请求的xml始终不一致,而如何构造也毫无头绪。
于是又看了下对方的wsdl文件。看到这样一段代码:
01 | <xs:complexType name= "HIPMessageServerRequest" > |
05 | <xs:element minOccurs= "0" name= "action" type= "xs:string" /> |
07 | <xs:element minOccurs= "0" name= "message" type= "xs:string" /> |
巧合下,我去查看了以下这个
complexType
于是找到这样一篇文章:http://blog.sina.com.cn/s/blog_61bafc5a0100mki2.html
文章告诉我们,php在调用这种webservice的时候,不能直接给参数赋值,而是应该使用stdclass
1 | 这时我们要传入的参数为对象类型,就要构造这么一个对象。 |
6 | 这个对象构造完成,把此对象实例作为参数传入即可。 |
就这样,原生的soapclient也解决了我的问题。附代码:
01 | $client = new SoapClient( "http://192.168.1.168:8080/center/services/HIPMessageServer?wsdl" , array ( 'trace' => 1)); |
03 | $tmp ->action= 'PatientRegistryFindCandidatesQuery' ; |
05 | $tmp ->message=iconv( 'gb2312' , 'utf-8' , './a.txt' ); |
06 | $result = $client ->HIPMessageServer( $tmp ); |
07 | echo "请求头:\n" . $client ->__getLastRequestHeaders() . "\n" ; |
08 | echo "请求体:\n" . htmlspecialchars_decode( $client ->__getLastRequest()) . "\n" ; |
09 | echo "返回头:\n" . $client ->__getLastResponseHeaders() . "\n" ; |
10 | echo "返回内容:\n" . $client ->__getLastResponse() . "\n" ; |
11 | var_dump((get_object_vars( $result ))); |
------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------
转载请注明本文标题和链接:《接上一篇,php的soapclient的问题》
发表评论