之前请求通过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";
于是又看了下对方的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)));