将SOAP请求从XML转换为PHP

时间:2014-08-20 10:38:03

标签: php xml soap

我在这里绝望,我正在尝试将在SoapUI中工作的XML SOAP请求转换为PHP。我在网上浏览了这么多文档,仍然无法从PHP中创建正确的请求。我尝试使用PHP中提供的SOAP类,SoapVars,SoapParams和SoapHeaders。这是我需要发送的请求(以XML格式):

<soapenv:Envelope 
xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' 
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' 
xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
xmlns:wsa='http://schemas.xmlsoap.org/ws/2004/03/addressing' 
xmlns:gen='http://www.polaris-uk.co.uk/GenericSchema/1_1/GenericTypes' 
xmlns:Detail='http://www.polaris-uk.co.uk/GenericSchema/2/PEMFault' 
xsi:SchemaLocation='http://www.polaris-uk.co.uk/GenericSchema/2/PEMFault http://ppw.imarket.co.uk/Polaris/Schema/PEMFault.xsd'>
<soapenv:Header>
  <wsse:Security 
  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis- 200401-wss-wssecurity-secext-1.0.xsd" 
  soapenv:mustUnderstand="1" 
  soapenv:actor="http://www.imarket.co.uk/soap/actor">
    <wsse:UsernameToken>
      <wsse:Username>XXXXXXXXXX</wsse:Username>
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-ns2curity-secext-1.0.xsd#PasswordText">XXXXXXXXXX</wsse:Password>
    </wsse:UsernameToken>
  </wsse:Security>
</soapenv:Header>

<soapenv:Body>
  <ConfirmImarketUserIDReq xmlns="http://www.polaris-uk.co.uk/Schema/1_1/ConfirmImarketUserIDReq"> 
    <ns1:UserID xmlns:ns1="http://www.polaris-uk.co.uk/GenericSchema/1_1/GenericTypes">XXXXXXXXXX</ns1:UserID> 
    <ns2:Password xmlns:ns2="http://www.polaris-uk.co.uk/GenericSchema/1_1/GenericTypes">XXXXXXXXXX</ns2:Password> 
  </ConfirmImarketUserIDReq>
</soapenv:Body>
</soapenv:Envelope>

直到现在我才会发布我所做的任何代码,因为它只是一团糟,因为我尝试一点一点地编写碎片而没有实际将它们放在一起,它只是垃圾邮件。

如果有人可以帮助将其转换为PHP代码,那将非常感激。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

在对此感到头疼之后,我终于找到了一个可行的解决方案,可能不是最好的,但它可以通过向SOAP调用提供Raw XML来实现:

$wsdl   = "XXXX.wsdl"; 
$client = new SoapClient($wsdl, array(  'soap_version' => SOAP_1_1,'trace' => true,)); 

//=========== Header Settings ============\\

//Namespace of the Web Service
$namespace = 'http://schemas.xmlsoap.org/soap/envelope/'; 

$headerXML = <<<XML
<wsse:Security 
  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
  SOAP-ENV:mustUnderstand="1" SOAP-ENV:actor="http://www.imarket.co.uk/soap/actor">
    <wsse:UsernameToken>
      <wsse:Username>XXXXXX</wsse:Username>
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-ns2curity-secext-1.0.xsd#PasswordText">XXXXXX</wsse:Password>
    </wsse:UsernameToken>
</wsse:Security>
XML;

$headerObj = new SoapVar($headerXML, XSD_ANYXML, null, null, null);
$header = new SoapHeader($namespace , 'SessionHeader', $headerObj);

// More than one header can be provided in this array.
$client->__setSoapHeaders(array($header));

//============== Request ================\\

$xml = <<<XML
  <ConfirmImarketUserIDReq xmlns="http://www.polaris-uk.co.uk/Schema/1_1/ConfirmImarketUserIDReq"> 
    <ns1:UserID xmlns:ns1="http://www.polaris-uk.co.uk/GenericSchema/1_1/GenericTypes">XXXXXX</ns1:UserID> 
    <ns2:Password xmlns:ns2="http://www.polaris-uk.co.uk/GenericSchema/1_1/GenericTypes">XXXXXX</ns2:Password> 
  </ConfirmImarketUserIDReq>
XML;

$args = array(new SoapVar($xml, XSD_ANYXML));

try {

    $response = $client->__soapCall( 'ConfirmImarketUserIDOp', $args);
    var_dump($response);
}
catch (SoapFault $e) {
  trigger_error("SOAP Fault: (faultcode: {$e->faultcode}, faultstring: {$e->faultstring})", E_USER_ERROR);
}

希望这对任何人都有帮助, 干杯!