我使用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下的回复不完整?
我曾经遇到过 SOAP XML 响应不完整的问题。
设置是这样的:
即使您使用不同的 Magento 版本和不同的 SOAP 调用,您也可能会遇到与我类似的错误。问题在于,对于大于 8000 字节的响应,HTTP Content-Length 标头计算不正确。
如何验证您是否受到此错误的影响:
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() );
}
}
}
如何更正 Content-Length 标头
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 标头。
为什么这个问题发生,我无法准确地告诉你,因为我没有一路追查这个错误。
据我所知,只要 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.
memory_limit
或
max_execution_time
错误。您应该能够通过在 Magento 根目录中的每个服务器上创建一个简单的文件(将文件放入 Magento 根目录中很重要,因为 .htaccess 文件可能会覆盖 PHP 设置)并比较值来比较您的 PHP 设置:
info.php
<?php phpinfo();
您还可以检查 Apache 错误日志以获取更多信息。