2010-10-26 12 views
8

Başlığa göre, new SoapClient'un, aslında SOAP sunucusuna göndermeden önce doğru olduğundan emin olmak için __soapCall()'u çalıştırmaya çalışmadan önce XML'in üretilmesi mümkün mü?PHP SOAP'in göndermeden önce göndermek istediği XML'yi önizleyebilir miyim?

+0

Eğer komut dosyasının bir parçası ya da "sadece" bir hata ayıklama aracı olarak (böylece incelemek için ama hiç senaryoyu değiştirmek için daha iyi olacak şekilde bunu yapmak istiyor musunuz araçları ile nesne) – VolkerK

+0

Sadece hata ayıklamak için. – bcmcfc

cevap

11

Türetilmiş sınıf kullanmak ve SoapClient sınıfı __doRequest() method üzerine olabilir.

<?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 ''; 
    } 
    } 
} 

baskılar

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

Ama bu ne zaman mümkün önlemek için çalıştıkları çalışması için (yani araçlar işini yapsın) gerçek kod biraz değiştirmek gerekir.

+0

Parlak, teşekkürler. – bcmcfc

+1

Prototip/değerlendirme aşamasında olduğunuz sürece muhtemelen sorun değil. Daha sonra "non-invaziv" araçları denemelisiniz. Php/yuva ile denemedim ama kemancı ve wireshark muhtemelen iş yapabilir. Ya ağ paketlerini getirmelerine izin verin veya komut dosyasını proxy olarak kullanmak için yapılandırın. http://www.fiddler2.com/fiddler2/ – VolkerK

+0

Tam olarak bu - İlk kurulum aşamasında XML'in doğru olduğundan emin olmak istedim. – bcmcfc

5

Daha önce değil ama sonra. Bkz:

SoapClient::__getLastRequest - Son SOAP isteğinde gönderilen XML'i döndürür.

Bu yöntem yalnızca SoapClient nesnesi, izleme seçeneği TRUE olarak ayarlandığında oluşturulduğunda çalışır. manuel

Örnek:

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

Şu an bunu kullanıyorum, sadece gönderilmeden önce XML'i görüp görmediğini bilmek istedim. Sanırım bu soruya cevap veriyor - yok! – bcmcfc

0

Bir not olarak, SOAP Sunucusu'nu denetlediyseniz, aslında sunucuya gönderilen orijinal SOAP isteğini yakalayabilirsiniz. Bunun için SOAP Sunucusu'nu genişletmeniz gerekiyor.

Bir örnek kod:

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