具有多个命名空间的PHP SOAP-Client

时间:2017-05-31 17:58:06

标签: php soap

我的php soapclient项目有问题。 从现在开始我使用curl发送soap请求,但出于不同的原因,我必须使用PHP的集成soap客户端。

我用于CURL的我(工作)请求看起来像这样:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:asc="http://asc.ws.ideal.com" xmlns:xsd="http://getserviceeventstatus.info.asc.ws.ideal.com/xsd">
   <soap:Header/>
   <soap:Body>
      <asc:getServiceEventStatus>        
         <asc:param>       
            <xsd:info>               
               <xsd:includePreviousEventsInfo>true</xsd:includePreviousEventsInfo>               
               <xsd:mainAscReferenceId>16111294</xsd:mainAscReferenceId>        
            </xsd:info>           
          <xsd:password>xxx</xsd:password>            
          <xsd:userId>xxx</xsd:userId>
         </asc:param>
      </asc:getServiceEventStatus>
   </soap:Body>
</soap:Envelope>

我的实际php脚本看起来像......

     <?php
error_reporting(E_ALL);

$wsdl = '/services/AscServiceSync?wsdl';
$location = '/services/AscServiceSync.AscServiceSyncHttpSoap11Endpoint/';

$options = array(
'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
'style'=>SOAP_RPC,
'use'=>SOAP_ENCODED,
'soap_version'=>SOAP_1_1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'connection_timeout'=>15,
'trace'=>true,
'encoding'=>'UTF-8',
'exceptions'=>true,
"location"=>$location
);

$client = new SoapClient($wsdl, $options);
$result = $client->getServiceEventStatus(array('userId' => 'xxx', 'password' => 'xxx', 'mainAscReferenceId' => '16111294'));
var_dump ($result);
print '<br />';
print $result->success;
print '<br />';

?> 

服务器返回错误消息“param”或​​“info”数据缺失

希望有人可以帮助我 谢谢!

3 个答案:

答案 0 :(得分:0)

一个错误可能是您没有设置includePreviousEventsInfo =&gt;真

fiddler跟踪会显示任何其他差异,例如需要执行某些操作以及将mainAscReferenceId置于“info”节点内。对于一些HTTPS站点,Fiddler将提供在流量的中间解码中为人安装假证书。

您还可以将请求发送到任何其他接受HTTP的网站,以查看发送的内容。

答案 1 :(得分:0)

我将请求发送到我自己的服务器并使用wireshark检查了包。

这是什么发送到服务器:

String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);   
if(provider.contains("gps")) {}

我还添加了“includePreviousEventsInfo”值,但它根本没有帮助。 当我输入“param”而不是“userId”时,我发现服务器错误消息更改为“info”缺失 - 当我将userId更改为“info”时,错误消息更改为“param”缺失...

答案 2 :(得分:0)

从您的wireshark xml响应来看,soapClient没有发送您在问题中提到的确切XML请求。您还可以使用下面的行检查上次生成的XML并进行调试。

$res = $client->__getLastRequest();

您的SOAP服务器需要多个嵌套的XML请求,您可以通过传递多维数组来生成该请求。

$reqArr = [
    'info' => [
        'includePreviousEventsInfo' => true,
        'mainAscReferenceId' => 16111294
    ],
    'password' => 'xxxxxx',
    'userId' => 'xxxxxx',
];

$res = $client->__soapCall('getServiceEventStatus', $reqArr);

如果它仍然给你错误,那么检查上面方法中的最后一个请求XML。

希望它有所帮助。