我确定这是一个愚蠢的新手问题,但这是我第一次使用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查找文件的范围和位置,我想我会更好地了解放置它们的位置以及如何引用它们。
答案 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文件时,它工作正常,但从服务器上的脚本却没有。它仍然没有用,但我至少取得了进展。