我的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”数据缺失
希望有人可以帮助我 谢谢!
答案 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。
希望它有所帮助。