2010-10-26 10 views
8

Co do tytułu, czy możliwe jest wydrukowanie pliku XML, który został utworzony przez new SoapClient, przed próbą uruchomienia __soapCall(), aby upewnić się, że jest poprawny przed faktycznym wysłaniem go na serwer SOAP?Czy mogę wyświetlić podgląd XML, który PHP SOAP chce wysłać przed wysłaniem?

+0

Chcesz zrobić to jako część skryptu lub „tylko” jako narzędzie do debugowania (tak byłoby lepiej, aby nie zmienić scenariusz w ogóle, ale do wglądu obiekt z narzędziami) – VolkerK

+0

Tylko do debugowania. – bcmcfc

Odpowiedz

11

Można użyć klasy pochodnej i zastąpić __doRequest() method klasy 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 ''; 
    } 
    } 
} 

drukuje

<?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 

ale trzeba zmienić rzeczywisty kod trochę dla tej pracy, które staram się unikać, jeśli to możliwe (czyli niech narzędzia do pracy).

+0

Świetne, dzięki. – bcmcfc

+1

To chyba dobrze, o ile jesteś w fazie prototypu/oceny. Później powinieneś wypróbować "nieinwazyjne" narzędzia. Nie próbowałem tego z php/gniazdkami, ale skrzypce i wireshark prawdopodobnie wykonają zadanie. Pozwól im pobrać pakiety sieciowe lub skonfiguruj swój skrypt tak, aby używał ich jako serwera proxy. http://www.fiddler2.com/fiddler2/ – VolkerK

+0

To jest dokładnie to - chciałem tylko upewnić się, że XML był poprawny w początkowej fazie instalacji. – bcmcfc

5

Nie wcześniej, ale później. Patrz:

SoapClient::__getLastRequest - Zwraca XML wysłany w ostatnim żądaniu SOAP.

Ta metoda działa tylko wtedy, gdy obiekt SoapClient został utworzony z opcją śledzenia ustawioną na TRUE.

przykład z podręcznika:

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

Używam tego w tej chwili, chciałem tylko wiedzieć, czy widziałem XML zanim został wysłany. Myślę, że to odpowiada na pytanie - nie ma! – bcmcfc

0

Uwaga: jeśli masz kontrolę nad serwerem SOAP, możesz faktycznie złapać oryginalne żądanie SOAP wysłane na serwer. W tym celu należy rozszerzyć serwer SOAP.

Kod próbki:

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