折雨的天空

博客介绍:本博客当前共有文章【968】篇,总阅读量【5,158,471】次,第一篇博客发表于【2011年04月06日 10时34分】,距今已【4978】天,感谢您的使用!

您的位置:折雨的天空 >php开发> 接上一篇,php的soapclient的问题

接上一篇,php的soapclient的问题

之前请求通过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的问题

奖励一下

取消

分享不易,烦请有多多打赏,如您也困难,点击右边关闭即可!

扫码支持
扫码打赏,5元,10元,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

-秒后自动关闭,如已打赏,或者不愿打赏,请点击右上角关闭图标。

发表评论

路人甲 表情
看不清楚?点图切换