some questions in SO有同样的问题,但其中任何一个都对我有帮助。
以下是调用Soap Web服务的代码:
$client = new SoapClient($wsdl, array(
'soap_version' => SOAP_1_1,
'trace' => 1,
'exceptions'=> true,
'encoding' => 'UTF-8',
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_DEFLATE,
'cache_wsdl' => WSDL_CACHE_NONE
))
$params = new SoapVar($xmlString, XSD_ANYXML, null, null);
try {
$client->functionName($params);
catch (SoapFault $f) {
print_r ($f);
}
这是(部分)SoapFault对象:
SoapFault Object
(
[message:protected] => Could not connect to host
[string:Exception:private] =>
[code:protected] => 0
[file:protected] => /home/user/Documentos/Web/Client.class.php //fileName
[line:protected] => 49 //line where I have $client->functionName
[trace:Exception:private] => Array
(
[0] => Array
(
[function] => __doRequest
[class] => SoapClient
[type] => ->
[args] => Array
(
[0] => <?xml version="1.0" encoding="UTF-8"?> // the XML
[1] => https://example.company.com/WSDLName.svc //name of WSDL
[2] => http://example.org/Pull/functionName //URL with name of the function
[3] => 1
[4] => 0
)
)
[1] => Array
(
[file] => /home/user/Documentos/Web/Client.class.php //fileName
[line] => 49
[function] => __call
[class] => SoapClient
[type] => ->
[args] => Array
(
[0] => functionName
[1] => Array
(
[0] => SoapVar Object
(
[enc_type] => 147
[enc_value] => //the XML
)
)
)
)
如果我拨打print_r($client->__getLastRequest());
并在SoapUI中测试打印的XML,则所有内容都像魅力一样。
如果我打电话给print_r(file_get_contents($wsdl));
我得到了WSDL文件。
尝试var_dump($client->__getLastRequestHeaders())
,获取null
;
我的尝试到现在为止:
1)在行ini_set('soap.wsdl_cache_enabled',0);
之前放置$client = new SoapClient...
。同样的错误。
2)将呼叫线路更改为$client->__soapCall('functionName',(array)$params)
。同样的错误。唯一的区别是使用<
和
格式化的XML。
3)将我的肥皂选项改为array('soap_version' => SOAP_1_1,'trace' => 1)
。同样的错误。
4)wsdl URL是一个http URL,所以我认为这不是SSL问题。但是,在SoapFault对象中,我使用https收到相同的网址,因此我将$ wsdl更改为使用https://的网址,并收到错误SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://example.company.com/WSDLName.svc?wsdl'
。
正如我所说,SoapUI中一切正常。
最后,这是我的服务器信息:
Ubuntu 14.04.3 LTS
Apache 2.4.7
PHP 5.5.9
有人知道我做错了吗?
更新
根据以下评论,以下是更多信息:
1)浏览器中的http
和https
个URL都返回WSDL文档。
2)如果我在终端中ping wsdl URL,我会收到ping: unknown host https://example.org/Pull/functionName
。 WSDL还有一个名为Ping的方法,定义为:
<wsdl:operation name="Ping">
<soap:operation soapAction="http://tempuri.org/IPull/Ping" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
当我在PHP中使用它时,我得到了相同的场景:Soap Fault“无法连接到主机”,但是在SoapUI中创建的XML工作正常。
3)var_dump($client)
的结果是:
object(SoapClient)[42]
public 'trace' => int 1
public 'compression' => int 32
public '_encoding' => string 'UTF-8' (length=5)
public '_soap_version' => int 1
public 'sdl' => resource(30, Unknown)
注意 :我有一个解决方法来处理明确不是最佳选择的问题,但有效。
我使用DOMDocument
或SimpleXML
创建了整个XML正文(包含肥皂信封),然后通过cURL
将其发送到网址https://example.company.com/WSDLName.svc
。
这很难看,但在我等待任何其他解决方案的时候,我一直都在努力。