折雨的天空
接上一篇,php的soapclient的问题
2015-11-11 我好笨


之前请求通过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)));



发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容