在哪里放置WSDL以及如何引用SoapClient

时间:2011-12-28 17:50:15

标签: php magento soap magento-1.5 soap-client

我确定这是一个愚蠢的新手问题,但这是我第一次使用SOAP,所以我想我有资格。我有一段时间试图从我的PHP类中加载本地WSDL文件。我不明白它在哪里寻找文件或我如何在本地引用它。我可以使用完整的网站网址放置绝对路径,但这似乎有点矫枉过正,它只能在这个网站上工作。我更喜欢使用相对路径引用该文件。

我正在使用PHP和Magento商店。处理与SOAP服务器通信的类是Namespace_Module_Model_Carrier_Fedex_Addressvalidation,它位于app/code/local/Namespace/Module/Model/Carrier/Fedex/Addressvalidation.php。使用Mage::getModel('shippingrates/carrier_fedex_addressvalidation')类中的Namespace_Module_Model_Carrier_Fedex实例化此类的实例。 WSDL位置在地址验证类的顶部定义:

protected $_wsdl = 'AddressValidationService_v2.wsdl';

在模型的构造函数中,我初始化SoapClient:

$this->_client = new SoapClient($this->_wsdl);
$this->_client->__setLocation($this->getServiceLocation());//returns a remote URL for their test server

该文件与 Addressvalidation.php 文件位于同一目录中,但我也尝试将其与 Fedex.php 脚本放在同一目录中以及 app / code / local / ,但没有任何作用。我已经尝试将WSDL变量设置为 ./ AddressValidationService_v2.wsdl 以及其他各种选项,但我总是得到这样的异常:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from './AddressValidationService_v2.wsdl' : failed to load external entity

如果有人可以帮助我了解SoapClient查找文件的范围和位置,我想我会更好地了解放置它们的位置以及如何引用它们。

2 个答案:

答案 0 :(得分:2)

通常,WSDL文件指向的URL不是本地文件。

因此,如果您在本地PC上设置并运行了Web服务,那么您可以设置客户端进行测试:

<?php

$wsdl = "http://127.0.0.1/api/service.wsdl";

$options = [
    'trace'      => 1,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE,
];

$client = new SoapClient($wsdl, $options);

$return = $client->getDetails([$id = 1234]);

echo "Request headers: " . print_r($client->__getLastRequestHeaders(), 1), "\n";
echo "Request: " . $client->__getLastRequest(), "\n";
echo "Response headers: " . print_r($client->__getLastResponseHeaders(), 1), "\n";
echo "Response: " . $client->__getLastResponse(), "\n";

这实际上来自我计算机上正在运行的PHP脚本。我用这种方式测试我自己的 SoapServer 并且它有效。 “getDetails”是WSDL文件中定义的方法,它需要一个参数,我将其作为$id传递。

调用后会输出调试行,这对我很有帮助。

答案 1 :(得分:0)

原来我的Apache服务器配置错误。它将我的请求重定向到“localhost”到同一服务器上的另一个虚拟主机。当我尝试从浏览器加载WSDL文件时,它工作正常,但从服务器上的脚本却没有。它仍然没有用,但我至少取得了进展。