2017-05-14 26 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