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