有人可以请解释如何通过PHP创建这个复杂的SOAP请求?

问题描述:

这是我需要发送的SOAP请求,它在SOAP UI程序中完美工作并返回有效的响应。有人可以请解释如何通过PHP创建这个复杂的SOAP请求?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.escapia.com/EVRN/2007/02"> 
    <soapenv:Body> 
     <ns:EVRN_UnitDescriptiveInfoRQ Target="Production" Version="1.0"> 
      <ns:POS> 
       <ns:Source> 
       <ns:RequestorID ID="username" MessagePassword="password"/> 
       </ns:Source> 
      </ns:POS> 
      <ns:UnitDescriptiveInfos> 
       <ns:UnitDescriptiveInfo/> 
      </ns:UnitDescriptiveInfos> 
     </ns:EVRN_UnitDescriptiveInfoRQ> 
    </soapenv:Body> 
</soapenv:Envelope> 

以下是我在PHP已经试过......

$wsdl = 'https://api.escapia.com/EVRNContentService.svc?wsdl'; 

$options = array(
    'trace' => false 
); 

$client = new \SoapClient($wsdl, $options); 

$xmlr = new SimpleXMLElement('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.escapia.com/EVRN/2007/02"> 
    <soapenv:Body> 
     <ns:EVRN_UnitDescriptiveInfoRQ Target="Production" Version="1.0"> 
      <ns:POS> 
       <ns:Source> 
       <ns:RequestorID ID="username" MessagePassword="password"/> 
       </ns:Source> 
      </ns:POS> 
      <ns:UnitDescriptiveInfos> 
       <ns:UnitDescriptiveInfo/> 
      </ns:UnitDescriptiveInfos> 
     </ns:EVRN_UnitDescriptiveInfoRQ> 
    </soapenv:Body> 
</soapenv:Envelope>'); 

$params = new SoapVar($xmlr, XSD_STRING); 

try { 
    $response = $client->UnitDescriptiveInfoStream($params); 

    echo '<pre>'; 
    var_dump($response); 
    echo '</pre>'; 
} catch (SoapFault $e) { 
    echo '<pre>'; 
    var_dump($client); 
    echo '</pre>'; 
} 

然而,这只是返回的响应..

object(stdClass)#4 (1) { 
    ["any"]=> 
    string(388) "Failed to authenticate anonymous client. Source array is missing from request." 
} 

请如果任何人有任何想法如何通过PHP正确地提出这个请求,那将是令人愉快的。

+1

您是否尝试过通过卷曲这样做呢? – Rimble

+0

如果您不使用'soapui',它可以从标签中删除。 – Rao

我强烈建议你使用一个WSDL到PHP生成器,所以你不会奇怪如何构造请求。此外,答复将很容易处理。

尝试PackageGenerator项目

我没有使用过PackageGenerator但我已经受够了这样的成功:

$xmlr = new SimpleXMLElement(...); 

$params = new stdClass(); 
$params->xml = $xmlr->asXML(); 

$response = $client->UnitDescriptiveInfoStream($params);