2017-05-14 27 views
0

我試圖做用PHP服務器的SOAP請求,但所有我得到的是「無法連接到主機」運行如何在PHP中調試SOAP?

$this->client->__soapCall("aMethod()", [$request_param_array])); 

我認爲WSDL是好的時候,因爲我能達到它在瀏覽器中運行

$this->client->__getFunctions(); 

當我收到可用功能的列表(在這個WSDL指定)。

我確實需要一個證書做SOAP調用到該服務器,所以也許這就是這個問題?但我不知道我怎麼能調試什麼導致此「無法連接到主機」錯誤。

任何想法是什麼可以導致這種錯誤發生或我怎麼能找到問題?

我迄今爲止代碼:

public function __construct($url, $wsdl = null) 
{ 
    $this->wsdl = $wsdl != null ? $wsdl : $url . '?wsdl'; 

    $this->client = new SoapClient($this->wsdl, array(
     "trace" => "1", 
     "local_cert" => realpath(__DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "..") . "cert.pfx", 
     "passphrase" => "admin", 
    )); 
    Log::info(sprintf("New SoapClient created with WSDL: '%s'", $this->wsdl)); 
} 

回答

0

我用SoapUI以後調試多一點解決這些SOAP相關的問題。 SoapUI給了我一個'SSL握手'異常。事實證明,這是一個無效的私鑰證書,與我連接的SOAP服務器上的公鑰證書不匹配。

雖然,我仍然沒有看到如何在PHP中調試這樣的問題。有任何想法嗎?讓我知道。

0

調試SOAP請求的最簡單和最好的方法是創建一個SOAP extension(請參閱註釋),它使用SoapClient類的以下功能記錄來自Web服務或Web服務客戶端的原始SOAP請求和原始SOAP響應:

SoapClient::__getLastRequestHeaders 
SoapClient::__getLastRequest 
SoapClient::__getLastResponseHeaders 
SoapClient::__getLastResponse 

不要忘記,使其工作,你必須與跟蹤選項創建SoapClient的對象打開:

$client = new MySoapClient($wsdlUrl, array('trace' => 1)); 

一個額外的小費在PHP開發SOAP的解決方案是清洗你的W時的tmp文件夾SDL合同更改(請參閱phpinfo()中的tmp文件夾路徑)強制PHP SoapClient重新下載WSDL和XSD文件,而不是使用緩存文件(直到它們到期)。

除了SoapUI,您還可以使用像查爾斯那樣的中間追蹤代理,如here所述。這種相當有效的方法的缺點是您添加更多圖層,因此可能會引入新問題。

也有商業的SOAP調試器是值得的錢,如XML Spy SOAP DebuggerSOAPSonar它確認和調用。無論如何,SoapUI永遠是一個很好的伴侶。

基本錯誤信息也可以在php日誌和web服務器日誌中找到。確保您已打開完整/明確的文本記錄。

+0

感謝您的評論!我的確發現了這些解決方案,但這種調試方式的缺點是證書錯誤發生在實際的請求之前。所以當有某種連接失敗時,不可能使用getLastResponse()的getLastRequest()方法。 – Kevin