Могу ли я предварительно просмотреть XML, который PHP SOAP хочет отправить, прежде чем отправлять его?
В соответствии с заголовком, можно ли вывести XML, созданный new SoapClient, прежде чем пытаться запустить __soapCall(), чтобы убедиться, что он правильный, прежде чем фактически отправить его на сервер SOAP?
3 ответов:
Можно использовать производный класс и перезаписать метод __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был создан с параметром трассировки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... } }
Comments