2010-10-26 15 views
8

Según el título, ¿es posible generar el XML creado por new SoapClient antes de intentar ejecutar un __soapCall() para garantizar que sea correcto antes de enviarlo al servidor SOAP?¿Puedo obtener una vista previa del XML que PHP SOAP desea enviar antes de enviarlo?

+0

¿Quieres hacer esto como parte de su guión o "sólo" como una herramienta de depuración (por lo que sería mejor no cambiar la secuencia de comandos en absoluto, sino para inspeccionar el objeto con herramientas) – VolkerK

+0

Solo para depurarlo. – bcmcfc

Respuesta

11

usted podría utilizar una clase derivada y sobrescribir el __doRequest() method de la clase 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 ''; 
    } 
    } 
} 

impresiones

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

pero tendría que cambiar el código real un poco para que esto funcione, que trato de evitar siempre que sea posible (es decir, dejar que las herramientas hacen el trabajo).

+0

Brillante, gracias. – bcmcfc

+1

Probablemente esté bien siempre que estés en la fase de prototipo/evaluación. Más tarde debes probar herramientas "no invasivas". No lo he probado con php/sockets pero violinista y wireshark probablemente hagan el trabajo. O permita que busquen los paquetes de red o configuren su secuencia de comandos para usarlos como un proxy. http://www.fiddler2.com/fiddler2/ – VolkerK

+0

Eso es exactamente, solo quería asegurarme de que el XML era correcto en la fase de configuración inicial. – bcmcfc

5

No antes, sino después. Ver

SoapClient::__getLastRequest - Devuelve el XML enviado en la última solicitud de SOAP.

Este método funciona solo si el objeto SoapClient se creó con la opción de rastreo establecida en TRUE.

Ejemplo de Manual:

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

Lo estoy usando en este momento, solo quería saber si había visto el XML antes de enviarlo. Sin embargo, creo que eso responde la pregunta: ¡no lo hay! – bcmcfc

0

Como nota, si tiene el control del servidor SOAP, puede capturar la solicitud SOAP original que se envía al servidor. Para esto, necesita extender el servidor SOAP.

Un código de ejemplo:

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