我可以使用PHP的SoapClient来解析SOAP响应,而不需要发出HTTP请求吗?

时间:2012-01-18 14:31:06

标签: php xml soap soap-client

我目前正在处理一个古老的支付处理器,它尽可能地连接到他们的服务(包括自定义客户端SSL证书,密码,以及之后的基本HTTP身份验证)。长话短说,我不能使用SoapClient来发出请求,但我已经能够用cURL来做。

我现在在字符串中有响应,我可以使用SoapClient来解析它吗?我宁愿不必手动解析它作为常规XML,因为我必须复制许多功能,例如在找到<SOAP:Fault>时抛出合理的异常。

3 个答案:

答案 0 :(得分:1)

不,你不能。

(只是为后人回答这个问题。基于缺乏相反的证据,你显然不能使用SoapClient来解析你已经拥有的SOAP响应)

答案 1 :(得分:0)

您可以使用SoapClientcontext选项定义上下文,告诉SoapClient使用SSL证书等。可以使用stream_context_create使用lots of options创建上下文

答案 2 :(得分:0)

让我们再次想象你已经调用了SoapClient :: __ doRequest(),并将XML SOAP响应返回到一个名为 $ response 的变量中。

<?php

   //LOAD RESPONSE INTO SIMPLEXML
   $xml = simplexml_load_string($response);

   //REGISTER NAMESPACES
   $xml->registerXPathNamespace('soap-env', 'http://schemas.xmlsoap.org/soap/envelope/');
   $xml->registerXPathNamespace('somenamespace', 'http://www.somenamespace/schema/');
   //...REGISTER OTHER NAMESPACES HERE...

   //LOOP THROUGH AND GRAB DATA FROM A NAMESPACE
   foreach($xml->xpath('//somenamespace:MessageHeader') as $header)
   {
      echo($header->xpath('//somenamespace:MyData')); 
   }

   //...ETC...

?>

这只是一些示例/伪代码(未经过测试,不会按原样运行)。我的观点是你手动获取了SOAP响应,所以现在你所要做的就是解析它。 SimpleXML是您可以使用的一个解决方案。