17

我的问题很常见。我阅读了关于这个问题的几乎所有关于 stackoverflow 的主题,但仍然无法完成工作。我的代码是:

ini_set("soap.wsdl_cache", "0");
ini_set("soap.wsdl_cache_enabled", "0");
$proxy = new SoapClient('http://Myhostname/api/soap?wsdl');

我有这个错误:

Error WSDL: SOAP-ERROR: Parsing WSDL: Couldn't load from 
'http://Myhostname/api/soap?wsdl' : failed to load external entity 
"http://Myhostname/api/soap?wsdl"

在浏览器中的 URL

http://Myhostname/api/soap?wsdl

效果很好(返回一个 xml 响应)

我尝试使用此代码查看 PHP 是否可以访问此 URL:

if (file_get_contents('http://Myhostname/api/soap?wsdl') === false) {
    echo "ERROR: file_get_contents <br/>";
}

它显示我的错误“错误:file_get_contents”,所以它不起作用。在论坛上,我看到要解决这个问题,我必须将主机名添加到操作系统“主机”文件中。所以我做到了。在我的主机文件中,我添加了这一行 127.0.0.1 Myhostname

但它仍然不起作用。然后我将代码中的 URL 更改为

http://localhost/Myhostname/api/soap?wsdl

但它也不起作用。

我尝试了另一种在互联网上找到的解决方案。对某些人来说,它起作用了。在我的网址中,我更改了“?” 字符为 '.'。所以我的新网址变成了

http://localhost/Myhostname/api/soap.wsdl

但它也不起作用。

我看到了官方 SOAP 文档!并尝试以不同的方式创建 SoapClient 对象(使用“proxy_host”和“proxy_port”等选项)。但这对我没有帮助。

这是我尝试解决这个问题的第二天,但我做不到。我正在实习,我没有很多经验,所以也许我没有尝试我找到正确的解决方案。也许有人可以帮忙。我会很高兴的。

4

4 回答 4

3

Few steps to check

Have a ping to Myhostname. It would give the ip. Use ip instead and see

Check if the services are enabled S0AP, php_openssl, openssl, curl

Hope you would get it :)

于 2013-04-22T09:53:15.413 回答
2

我有类似的问题,我从 .htaccess 文件中取消注释 -MultiViews,然后从本地网站的 Apache 配置中解决它。

我的工作 Apache 配置是:

<Directory /var/www/>
        Options Indexes FollowSymLinks -MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
</Directory>

您也可以尝试网址:

http://localhost/Myhostname/api.php?type=soap&wsdl

如果您使用社区版。

于 2013-04-22T09:14:06.197 回答
1

而不是$proxy = new SoapClient( 'http://Myhostname/api/soap?wsdl');
尝试$proxy = new SoapClient(WSDLFILENAME);
其中 WSDLFILENAME 是 WSDL 文件的操作系统名称。这具有减少一个客户端-服务器往返的额外好处。

于 2013-04-28T17:41:58.430 回答
0

我在本地主机上尝试了SOAP Web Services它,它工作正常。无法对请求做出响应的原因Magento是它无法SSL Certificates在网站上验证启用。

我解决它的方法是允许自签名SSL verification

$opts = [
    'http' =>
     [
         'header' => "Authorization: Bearer ".$token
        ],
'ssl' => [
    'allow_self_signed' => true , 
    'verify_peer' => false, 
    'verify_peer_name' => false]
];
$context = stream_context_create($opts);

我希望它有所帮助。;)

于 2018-10-24T12:00:20.893 回答