PHP SOAP 将信封发送到 WSDL



我真的希望我设法为此写出正确的标题。基本上,我需要连接以向某个 url 发出 SOAP 请求,并从那里检索数据。

这是我需要发送的请求:

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:rad="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Request" xmlns:rad1="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Security.Request">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:RetrieveSecurityToken>
         <!--Optional:-->
         <tem:RetrieveSecurityTokenRequest>
            <rad:CarrierCodes>
               <!--Zero or more repetitions:-->
               <rad:CarrierCode>
                  <rad:AccessibleCarrierCode>FZ</rad:AccessibleCarrierCode>
               </rad:CarrierCode>
            </rad:CarrierCodes>
            <rad1:LogonID>xxx</rad1:LogonID>
            <rad1:Password>xxxx</rad1:Password>
         </tem:RetrieveSecurityTokenRequest>
      </tem:RetrieveSecurityToken>
   </soapenv:Body>
</soapenv:Envelope>

这是我的代码

$url = "http://uat.ops.connectpoint.flydubai.com/ConnectPoint.Security.svc?wsdl";
$data =  array(  "LogonID"=>"xxxxx",  "Password"=>"xxxxx");
$client = new SoapClient($url);
$client->__soapCall("RetrieveSecurityToken", $data);

和请求错误

Fatal error: Uncaught SoapFault exception: [a:DeserializationFailed] The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'RetrieveSecurityToken'. End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 162. in J:WORKwebflyDubaiindex.php:25 Stack trace: #0 J:WORKwebflyDubaiindex.php(25): SoapClient->__soapCall('RetrieveSecurit...', Array) #1 {main} thrown in J:WORKwebflyDubaiindex.php on line 25`

当我调用 __getTypes(( 时,我得到(除其他外(:

struct RetrieveSecurityToken {
    string LogonID;
    string Password;
}

我想我提出的这个请求不正确(也许我应该发送转换为数组的整个 xml(,但我无法弄清楚如何发送正确的请求?

您调用的方法需要RetrieveSecurityTokenRequest XSD 文件中定义的类型 RetrieveSecurityToken 的参数。在那里,您可以看到它是从CarrierInfo添加LogonIDPassword属性扩展而来的。

基类型 CarrierInfo 在其他 XSD 文件中定义。它具有 ArrayOfCarrierCode 类型的单个属性CarrierCodes,该属性是 CarrierCode 对象的数组,每个对象都有一个AccessibleCarrierCode字符串属性。

在 WSDL 中,CarrierInfo被指定为可移动(允许<rad:CarrierCodes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />(并且可以是空数组(允许<rad:CarrierCodes/>(,但在这些情况下,服务会回复错误。

因此,这就是为什么您应该按照您在问题中发布的示例 XML 创建请求,至少有一个运营商代码:

$code = new StdClass;
$code->AccessibleCarrierCode = "FZ";
$data = new StdClass;
$data->CarrierCodes = array($code);
$data->LogonID = "xxxxx";
$data->Password = "xxxxx";
$client = new SoapClient($url);
$response = $client->RetrieveSecurityToken(array("RetrieveSecurityTokenRequest" => $data));
var_dump($response);

相关内容

  • 没有找到相关文章

最新更新