Могу ли я просмотреть XML, который PHP SOAP хочет отправить перед отправкой?

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

Вы можете использовать производный класс и перезаписать метод __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 

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

Не раньше, а после. Видеть

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

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

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

 <?php $client = new SoapClient("some.wsdl", array('trace' => 1)); $result = $client->SomeFunction(); echo "REQUEST:\n" . $client->__getLastRequest() . "\n"; ?> 

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

Пример кода:

 class MySoapServer extends SoapServer { public function handle($request = null) { if (null === $request) $request = file_get_contents('php://input'); // Log the request or parse it... } }