Magento - 在 Lion 下使用 MAMP 堆栈时 SOAP API 响应不完整

问题描述 投票:0回答:2

我使用soapUI 测试了Magento 的SOAP API。我成功登录并获得了登录哈希。 然后我尝试检索产品列表,效果很好。

这是在使用最新版本的 Apache、mySQL 和 PHP 的 Linux 服务器上。

然后我创建了 Magento 和数据库的备份。我想使用 MAMP 堆栈在 Lion 服务器上创建一个测试环境。 Magento 备份似乎工作正常,但 SOAP API 却不行。

我再次使用soapUI来获取登录哈希并尝试检索所有产品。但现在回复似乎不完整:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento">
<SOAP-ENV:Body>
<ns1:catalogProductListResponseParam>
<result>
<complexObjectArray>
<product_id>7167</product_id>
<sku>000140</sku>
... etc ...
<complexObjectArray>34</complexObjectArray>
</category_ids>
<website_ids>
<complexObjectArray>1</complexObjectArray>
</website_ids>
</complexObjectArray>
<complexObjectArray>
<product

为什么Lion/MAMP下的回复不完整?

magento soapui magento-soap-api
2个回答
11
投票

我曾经遇到过 SOAP XML 响应不完整的问题。

设置是这样的:

  • Linux 服务器
  • Magento CE 1.5.1.0
  • 使用 SOAP v2 并启用 WS-I 合规性
  • 调用 sales_order.info

即使您使用不同的 Magento 版本和不同的 SOAP 调用,您也可能会遇到与我类似的错误。问题在于,对于大于 8000 字节的响应,HTTP Content-Length 标头计算不正确。

如何验证您是否受到此错误的影响

    执行一个提供简短响应的调用(例如“catalog_category.info”,只有一个商店视图和几个属性)。如果 XML 完整,请检查响应是否有长度
  1. <= 8000 bytes.
  2. 将文件 app/code/core/Mage/Api/Model/Server/Wsi/Adapter/Soap.php 复制到 app/code/local 文件夹并编辑 run() 方法。如果您在 SOAP URL 中使用“wsdl”参数,请编辑“if”结构的第一部分,否则编辑“else”部分。
由于第二种方法是更准确的方法,所以我会选择这种方法。

    打开文件并搜索 ->setBody() 方法调用。正如您所看到的,正在进行一些搜索/替换魔法。
  1. 将搜索/替换操作的结果写入变量并记录以供进一步检查。代码可能如下所示:

    public function run() { $apiConfigCharset = Mage::getStoreConfig("api/config/charset"); if ($this->getController()->getRequest()->getParam('wsdl') !== null) { /* don't modify the first part ... */ } else { try { $this->_instantiateServer(); $content = preg_replace( '/(\>\<)/i', ">\n<", str_replace( '<soap:operation soapAction=""></soap:operation>', "<soap:operation soapAction=\"\" />\n", str_replace( '<soap:body use="literal"></soap:body>', "<soap:body use=\"literal\" />\n", preg_replace( '/<\?xml version="([^\"]+)"([^\>]+)>/i', '<?xml version="$1" encoding="'.$apiConfigCharset.'"?>', $this->_soap->handle() ) ) ) ); Mage::log($content, null, 'soap.log'); $this->getController()->getResponse() ->clearHeaders() ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset) ->setBody($content); } catch( Zend_Soap_Server_Exception $e ) { $this->fault( $e->getCode(), $e->getMessage() ); } catch( Exception $e ) { $this->fault( $e->getCode(), $e->getMessage() ); } } }
    
    
  2. 执行 SOAP API 调用并在 Magento 目录中打开 var/log/soap.log。如果日志文件中的 XML 完整,但响应中不完整,则 Content-Length 标头就是问题所在。

如何更正 Content-Length 标头

  1. 保留 Mage_Api_Model_Server_Wsi_Adapter_Soap 副本并在我们刚刚修改的代码中添加一行:

    public function run() { $apiConfigCharset = Mage::getStoreConfig("api/config/charset"); if ($this->getController()->getRequest()->getParam('wsdl') !== null) { /* don't modify the first part ... */ } else { try { $this->_instantiateServer(); $content = preg_replace( '/(\>\<)/i', ">\n<", str_replace( '<soap:operation soapAction=""></soap:operation>', "<soap:operation soapAction=\"\" />\n", str_replace( '<soap:body use="literal"></soap:body>', "<soap:body use=\"literal\" />\n", preg_replace( '/<\?xml version="([^\"]+)"([^\>]+)>/i', '<?xml version="$1" encoding="'.$apiConfigCharset.'"?>', $this->_soap->handle() ) ) ) ); Mage::log($content, null, 'soap.log'); $this->getController()->getResponse() ->clearHeaders() ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset) ->setHeader('Content-Length',strlen($content), true) ->setBody($content); } catch( Zend_Soap_Server_Exception $e ) { $this->fault( $e->getCode(), $e->getMessage() ); } catch( Exception $e ) { $this->fault( $e->getCode(), $e->getMessage() ); } } }
    
    
    注意这一行:

    ->setHeader('Content-Length',strlen($content), true)
    
    
    我们计算并设置 Content-Length 标头。第三个参数 true 很重要,因为它告诉框架覆盖现有的 Content-Length 标头。

  2. 如果有效,请删除 Mage::log() 调用并重写代码以在您自己的扩展中使用。
如果你问

为什么这个问题发生,我无法准确地告诉你,因为我没有一路追查这个错误。

据我所知,只要 XML 响应有长度,一切都很好

<= 8000 bytes. If the response is longer than 8000 bytes and the XML consists of x lines, the response is truncated by x characters. It looks like it is a problem with the different carriage return codes and/or with encoding issues which lead to the wrong calculation of the response content length.


0
投票
我认为您的 PHP 配置已更改。您可能会遇到 PHP.ini

memory_limit

max_execution_time
 错误。您应该能够通过在 Magento 根目录中的每个服务器上创建一个简单的文件(将文件放入 Magento 根目录中很重要,因为 .htaccess 文件可能会覆盖 PHP 设置)并比较值来比较您的 PHP 设置:

info.php

<?php phpinfo();

您还可以检查 Apache 错误日志以获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.