更改 SOAP 请求格式

chi*_*ips 5 php xml soap wsdl

我正忙着编写一个 SOAP 脚本,该脚本大部分工作正常,但是有一个请求无法正常工作,并且主机公司要求更改请求 XML 的格式,我陷入了困境...

目前我的 XML 请求如下所示...

<?xml version="1.0"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.???.com/???/">
  <env:Body>
    <ns1:GetTransactions>
      <ns1:Filter>
        <ns1:CardId>1234</ns1:CardId>
      </ns1:Filter>
      <ns1:Range>
        <ns1:FirstRow/>
        <ns1:LastRow/>
      </ns1:Range>
    </ns1:GetTransactions>
  </env:Body>
</env:Envelope>
Run Code Online (Sandbox Code Playgroud)

但主办公司要求它看起来像这样......

<?xml version="1.0"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
  <env:Body>
    <GetTransactions xmlns="http://www.???.com/???/">
      <Filter>
        <CardId>1234</CardId>
      </Filter>
      <Range>
        <FirstRow/>
        <LastRow/>
      </Range>
    </GetTransactions>
  </env:Body>
</env:Envelope>
Run Code Online (Sandbox Code Playgroud)

我的形成请求的 PHP 如下......

$wsdl = 'http://???.com/???/???.asmx?WSDL';
$endpoint = 'http://???.com/???/???.asp';

$soap_client = new SoapClient( $wsdl, array(
    'soap_version'  => SOAP_1_2,
    'trace'         => 1,
    'exceptions'    => 0,
    'features'      => SOAP_SINGLE_ELEMENT_ARRAYS,
    'location'      => $endpoint
) );

$get_transactions = $soap_client->GetTransactions( array(
    'Filter' => array(
        'CardId'    => '1234'
    ),
    'Range' => array(
        'FirstRow'  => NULL,
        'LastRow'   => NULL
    )
) );
Run Code Online (Sandbox Code Playgroud)

任何人都可以为我指出更改输出 XML 格式所需的正确方向吗?

chi*_*ips 4

托管公司的 Web 服务存在问题。Web 服务应该接受发送的格式,因为它是格式正确的 XML。

一个黑客解决方案

感谢 Wrikken 的建议,我想出了一个巧妙的解决方案。真正的答案是托管公司修复其 Web 服务以接受格式正确的 XML 请求。

我扩展了 SoapClient 类,这样我就可以在将 XML 发送到服务器之前对其进行编辑...

$namespace = 'http://www.???.com/???/';

class HackySoapClient extends SoapClient {

    function __doRequest( $request, $location, $action, $version, $one_way = 0 ) {

        global $namespace;

        // Here we remove the ns1: prefix and remove the xmlns attribute from the XML envelope.
        $request = str_replace( '<ns1:', '<', $request );
        $request = str_replace( '</ns1:', '</', $request );
        $request = str_replace( ' xmlns:ns1="' . $namespace . '"', '', $request );

        // The xmlns attribute must then be added to EVERY function called by this script.
        $request = str_replace( '<Login',           '<Login xmlns="' . $namespace . '"', $request );
        $request = str_replace( '<GetTransactions', '<GetTransactions xmlns="' . $namespace . '"', $request );

        return parent::__doRequest( $request, $location, $action, $version, $one_way = 0 );

    }

}

$soap_client = new HackySoapClient( $wsdl, array(...
Run Code Online (Sandbox Code Playgroud)