Magento Soap API 在本地工作但不在远程工作

标签 magento soap wsdl

我为 Magento Enterprise 1.11 创建了一个自定义 API。通过 Soap v1 调用 API 在我的本地开发环境中运行良好,但是我无法从本地环境调用远程环境。

在我的 localdev 上使用 PHP 交互式 shell:

php > $client = new SoapClient(WSDL_URI,array('trace'=>1));
php > $client->login(API_USER,API_KEY);
php > var_dump($client->__getLastResponse());
string(538) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:loginResponse><loginReturn xsi:type="xsd:string">f0eec73e49665aaf9cc4a6644fba5dc6</loginReturn></ns1:loginResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

我已经能够从本地主机以及在我的开发机器上运行的两个本地虚拟机之间成功地做到这一点。我还可以毫无问题地访问我的自定义 API 的方法。

但是,当我尝试为我的远程测试环境创建一个 soap 客户端时,我能够创建客户端,但是对 $client->login() 的调用或任何后续调用都会导致以下结果:
php > $client = new SoapClient(REMOTE_WSDL_URI,array('trace'=>1));
php > $client->login(API_USER,API_KEY);
PHP Warning:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://REMOTE_HOST/index.php/api/index/index/wsdl/1/' : failed to load external entity "http://REMOTE_HOST/index.php/api/index/index/wsdl/1/" in php shell code:1
Stack trace:
#0 php shell code(1): SoapClient->__call('login', Array)
#1 php shell code(1): SoapClient->login(API_USER, API_KEY)
#2 {main}
php > var_dump($client->__getLastRequestHeaders());
string(255) "POST /index.php/api/index/index/ HTTP/1.1
Host: REMOTE_HOST
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.18-1~dotdeb.0
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:Mage_Api_Model_Server_HandlerAction"
Content-Length: 550

php > var_dump($client->__getLastResponseHeaders());
string(840) "HTTP/1.1 500 Internal Service Error
Date: Mon, 11 Feb 2013 19:06:56 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.19-1~dotdeb.0
Set-Cookie: PHPSESSID=7uqrcmiv96hroubnb1uu7c7cm6; expires=Wed, 13-Feb-2013 01:06:56 GMT; path=/; domain=.REMOTE_HOST; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: CUSTOMER=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.REMOTE_HOST; httponly
Set-Cookie: CUSTOMER_INFO=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.REMOTE_HOST; httponly
Set-Cookie: CUSTOMER_AUTH=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.REMOTE_HOST; httponly
Content-Length: 468
Vary: Accept-Encoding
Connection: close
Content-Type: text/xml; charset=utf-8

php > var_dump($client->__getLastResponse());
string(468) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>WSDL</faultcode><faultstring>SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://REMOTE_HOST/index.php/api/index/index/wsdl/1/' : failed to load external entity "http://REMOTE_HOST/index.php/api/index/index/wsdl/1/"
</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

当我点击//REMOTE_HOST/index.php/api/?wsdl 时,我得到了标准的 Magento WSDL。

这两个环境 99.99% 相同:
  • 服务器版本:Apache/2.2.16 (Debian)(本地开发和远程)
  • PHP 5.3.18(本地开发)5.3.19(远程主机)
  • Apache/PHP 配置是相同的。
  • 代码库相同

  • 我在网上搜索了一些线索,包括:
  • http://www.magentocommerce.com/boards/viewthread/56528/
  • http://www.magentocommerce.com/wiki/5_-_modules_and_development/web_services/overriding_an_existing_api_class_with_additional_functionality#wsdl
  • Unable to connect to Magento SOAP API v2 due to "failed to load external entity"
  • Magento API SOAP-ERROR: Parsing WSDL: Couldn't load from '[url]/index.php/api/index/index/?wsdl=1' : Couldn't find end of Start Tag part line 56
  • http://www.magentocommerce.com/api/soap/introduction.html

  • 我已经尝试了 sedond-to-last 链接中提到的“Content-Length”标题修复,以及我能想到的几乎所有其他东西......难倒。

    最佳答案

    虽然您可以从您的计算机加载 WSDL URL ( http://REMOTE_HOST/index.php/api/index/index/wsdl/1/ ),但您的远程服务器无法通过其 REMOTE_HOST 联系自己。 .

    PHP 的 SoapServer 对象(由 Magento 的实现使用)需要联系 WSDL 才能知道暴露了哪些方法。

    由于我一直无法弄清楚的原因,服务器无法访问自己的 DNS 条目是一种常见的网络配置。通过 SSH 连接到您的服务器并尝试运行以下命令

    curl http://REMOTE_HOST/index.php/api/index/index/wsdl/1/
    

    我的猜测是您会收到网络超时或 REMOTE_HOST未知错误。修复您的配置,以便您的服务器可以访问自己,一切都应该开始工作。

    关于Magento Soap API 在本地工作但不在远程工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14822866/

    相关文章:

    php - 从 Magento 销售 > 订单中删除已删除的订单

    java - 生成的 WSDL 文件位于哪里?

    java - 通过客户端发送到 SOAP Web 服务的对象大小是否有限制?

    php - 函数 callDoDirectPayment() 的 Magento 支付失败

    php - 如何使用 addAttributeToFilter 在 Magento 中搜索 db 中的多选值?

    Magento 中的 SSL 错误

    java - 如何在 Java 中手动将 cookie 添加到 Web 服务调用中?

    xml - Node SOAP : How to create a complex message with specific attributes?

    php - Symfony2 使用 besimple/soap-client 包使用 SOAP 服务

    java - 如何正确将wsdl文件添加到java项目资源中并获取其路径