Могу ли я просмотреть XML, который PHP SOAP хочет отправить перед отправкой? - PullRequest
8 голосов
/ 26 октября 2010

В соответствии с заголовком, можно ли вывести XML, созданный new SoapClient, прежде чем пытаться запустить __soapCall(), чтобы убедиться, что он верен, перед его отправкой на SOAP-сервер?

Ответы [ 3 ]

12 голосов
/ 26 октября 2010

Вы можете использовать производный класс и перезаписать метод __ doRequest () класса SoapClient.

<?php
//$clientClass = 'SoapClient';
$clientClass = 'DebugSoapClient';
$client = new $clientClass('http://www.webservicex.com/CurrencyConvertor.asmx?wsdl');
$client->sendRequest = false;
$client->printRequest = true;
$client->formatXML = true;

$res = $client->ConversionRate( array('FromCurrency'=>'USD', 'ToCurrency'=>'EUR') );
var_dump($res);

class DebugSoapClient extends SoapClient {
  public $sendRequest = true;
  public $printRequest = false;
  public $formatXML = false;

  public function __doRequest($request, $location, $action, $version, $one_way=0) {
    if ( $this->printRequest ) {
      if ( !$this->formatXML ) {
        $out = $request;
      }
      else {
        $doc = new DOMDocument;
        $doc->preserveWhiteSpace = false;
        $doc->loadxml($request);
        $doc->formatOutput = true;
        $out = $doc->savexml();
      }
      echo $out;
    }

    if ( $this->sendRequest ) {
      return parent::__doRequest($request, $location, $action, $version, $one_way);
    }
    else {
      return '';
    }
  }
}

печать

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.webserviceX.NET/">
  <SOAP-ENV:Body>
    <ns1:ConversionRate>
      <ns1:FromCurrency>USD</ns1:FromCurrency>
      <ns1:ToCurrency>EUR</ns1:ToCurrency>
    </ns1:ConversionRate>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
NULL

Но вам придется немного изменить реальный код, чтобы это работало, чего я стараюсь избегать, когда это возможно (т. Е. Пусть инструменты работают).

6 голосов
/ 26 октября 2010

Не до, а после. См

SoapClient::__getLastRequest - возвращает XML, отправленный в последнем запросе SOAP.

Этот метод работает, только если объект SoapClient был создан с параметром трассировки, установленным на TRUE.

Пример из руководства:

<?php
$client = new SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
?>
0 голосов
/ 04 января 2014

Как примечание, если у вас есть контроль над сервером SOAP, вы можете фактически перехватить исходный запрос SOAP, отправленный на сервер. Для этого вам нужно расширить SOAP Server.

Пример кода:

class MySoapServer extends SoapServer 
{
    public function handle($request = null)
    {
      if (null === $request)    
      $request = file_get_contents('php://input');
      // Log the request or parse it...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...