错误WSDL:SOAP-ERROR:解析WSDL:无法加载

时间:2013-04-12 02:20:55

标签: magento soap

我的问题非常普遍。关于这个问题,我几乎阅读了有关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"

在浏览器中输入网址

http://Myhostname/api/soap?wsdl

效果很好(返回xml响应)

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

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

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

但它仍然无效。然后我将代码中的URL更改为

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

但它也不起作用。

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

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

但它也不起作用。

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

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

4 个答案:

答案 0 :(得分:3)

检查的步骤很少

ping Myhostname。它会给ip。请改用ip而不是

检查服务是否已启用     S0AP, php_openssl, openssl, curl

希望你能得到它:)

答案 1 :(得分:1)

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

我的Apache配置是:

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

你也可以尝试url:

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

如果您使用社区版。

答案 2 :(得分:1)

而不是 $ proxy = new SoapClient('http://Myhostname/api/soap?wsdl');
尝试 $ proxy = new SoapClient(WSDLFILENAME);
其中WSDLFILENAME是WSDL文件的OS名称。 这样做的另一个好处是可以减少一次客户端 - 服务器往返。

答案 3 :(得分: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);

我希望它会有所帮助。 ;)