当wsdl将服务端口绑定定义为https和端口80时,PHP SOAP请求失败的解决方法?

时间:2009-09-17 15:33:13

标签: php soap wsdl port soap-client

我正在使用php5的soap扩展程序来使用SOAP Web服务。服务'wsdl是使用Axis java2wsdl生成的,并且生成期间使用的任何选项都会导致端口绑定URL列为 https ://xxx.xxx.xxx.xxx**:80 **

如果我将wsdl下载到我的服务器,请从端口绑定位置值中删除端口80规范,并在我的soapclient调用中引用本地文件,它可以正常工作。

但是,如果我尝试远程引用它(或者下载并在本地引用它,那么)调用将因soap故障而失败。

我没有输入服务端,所以我不能让他们改变他们的wsdl生成过程。因此,除非有办法让soapclient对端口一无所知,否则我会坚持使用其他人'wsdl的本地修改副本(我宁愿不做)。

有关如何使我的soapclient忽略端口80的任何想法?

2 个答案:

答案 0 :(得分:2)

你可能想尝试使用$ options数组覆盖主机名/端口,你可以将它作为第二个参数传递给SoapClient的构造函数:

$client = new SoapClient("some.wsdl", array('proxy_host' => "https://example.org", 'proxy_port' => 443);

答案 1 :(得分:2)

如果找不到更优雅的解决方案,可以随时下载文件,进行字符串替换,然后将其用作WSDL。

$cached_wsdl_file = './cached_wsdl.xml';
if (filemtime($cached_wsdl_file) > time() - 3600) {
    $wsdl = file_get_contents('http://server/service?wsdl');
    $wsdl = str_replace('server:80', 'server', $wsdl);
    file_put_contents($cached_wsdl_file, $wsdl);
}
$client = new SoapClient($cached_wsdl_file);