【问题标题】:Where to put WSDL and how to reference for SoapClient放置 WSDL 的位置以及如何引用 SoapClient
【发布时间】:2011-12-28 17:50:15
【问题描述】:

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

我正在使用 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 查找文件的范围和位置,我想我会更好地了解将它们放在哪里以及如何引用它们。

【问题讨论】:

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


    【解决方案1】:

    通常 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 传递。

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

    【讨论】:

    • 在这种情况下,WSDL 文件存储在本地,但所有请求都发送到的服务器是远程的。为此,我使用 location 参数初始化 SoapClient(请参阅上面的问题...我对其进行了编辑以反映这一点)。
    • 为了继续开发,我将文件放在网络服务器的根目录中,并使用 http://localhost/wsdl/AddressValidationService_v2.wsdl 引用它。现在我收到一条错误消息,说 在 'http://localhost/wsdl/AddressValidationService_v2.wsdl' 中找不到 ....找不到什么??
    • 你需要指向一个完整的 url,包括 http:// 而不仅仅是 'localhost/wsdl/'
    • 尝试使用浏览器访问您的 wsdl,将localhost/wsdl/AddressValidationService_v2.wsdl 放入浏览器地址,如果您可以在浏览器中看到您的 wsdl 文件,那么只需在您的 SoapClient 中使用该 url。如果你看不到它浏览器有问题 - 你的 apache 服务器没有运行地址不正确
    • 我是...它正在将我的 URL 转换为链接并删除协议部分。我在两个斜杠之间放了一个空格,所以它不会在评论中这样做,但我在脚本中实际使用的是正确的。它现在正在查找 WSDL 文件,但我收到了新的 Couldn't find in... 错误。我不知道这是在抱怨什么。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多