之前请求通过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文件。看到这样一段代码:
巧合下,我去查看了以下这个
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)));
------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------