好的,所以这对我来说很奇怪,我已经为Magento Core API添加了一个自定义方法,它工作正常,除了我尝试以编程方式设置结果时:
public function infoByOmsId($omsId){
$customer_model = Mage::getModel('customer/customer');
$customer_model->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer_model->loadByOmsId($omsId);
$result = array();
$result['customer_id'] = $customer_model->getId();//51;
return $result;
如果我对值进行硬编码,它会在SOAP响应中返回,但是,当我以编程方式设置它时,响应值的节点将返回空白。我已经检查了代码 - 将它放在自己的php文件和var_dump的客户模型中 - 以确保它获得结果,并且数据元素在那里。我已经尝试将数组中的响应更改为单个字符串元素,并得到相同的结果。
我原本以为它可能是数据类型问题,因为我使用的是符合WSI标准的V2 API。但是我将响应类型从int更改为字符串(当我在我的独立代码中var_dump数组时,我得到一个字符串),这似乎也没有用。我肯定会收到“oms_id” - 一个自定义属性 - 在API中,因为我能够直接将它传回去,我在响应中得到它。我尝试从模型中以几种不同的方式获取我想要的值,没有一种方法可以从API返回XML值,但所有这些都在我的独立php文件中工作。
$customer_model->getData('entity_id');
$customer_model['entity_id'];
$customer_model->getId();
这是我的wsdl.xml文件:
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="customerId">
<all>
<element name="customer_id" type="xsd:string" minOccurs="0" />
</all>
</complexType>
</schema>
</types>
<message name="mycompanyInfoByOmsIdRequest">
<part name="sessionId" type="xsd:string" />
<part name="omsId" type="xsd:int" />
</message>
<message name="mycompanyInfoByOmsIdResponse">
<part name="customer_oms_id" type="xsd:customerId" />
</message>
和wsi.xml:
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:{{var wsdl.name}}">
<xsd:complexType name="mycompanyInfoByOmsId">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="customer_id" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="mycompanyInfoByOmsIdRequestParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="sessionId" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1" name="omsId" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="mycompanyInfoByOmsIdResponseParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="result" type="typens:mycompanyInfoByOmsId" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
这些动态值没有返回,我做错了什么?有人有这方面的经验吗?
答案 0 :(得分:0)
没有这方面的直接经验,但我不得不调试几个类似的问题。这里有一些提示可以帮助您跟踪此事。
首先,我知道您的琐事检查了您的代码是否返回了您认为它返回的内容,但我要求您将其检查四倍。具体而言,不是在单独的PHP文件中运行代码,而是从实际API调用中 log 值。
public function infoByOmsId($omsId){
$customer_model = Mage::getModel('customer/customer');
$customer_model->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer_model->loadByOmsId($omsId);
$result = array();
$result['customer_id'] = $customer_model->getId();//51;
Mage::Log($result);
Mage::Log($omsId);
return $result;
}
API代码在与标准Web请求稍有不同的上下文中运行(除了商店ID为“0”),并且我不止一次在API上下文中运行的代码重新调整了与标准中的代码不同的值前端或adminhtml上下文。另外,请确保您的代码正确接收$omsId
。
其次,这对我来说听起来像是一个可能的数据类型/转换问题 - 由于缓存,您可能会在整个过程中忽略对架构的更改。我确定你知道Magento的缓存--Magento将缓存生成的WSDL。因此,无论何时进行配置更改,您都需要清除缓存。 (直接从var/cache
删除是从“确保缓存被破坏”的观点来看这个问题的最佳方法。
除了Magento的WSDL缓存之外, PHP 还有一种机制可以在客户端和服务器端缓存WSDL文件。这与Magento的缓存无关。因此,即使您清除了Magento缓存,也要确保每个人都看到相同的WSDL文件,您需要/需要清除PHP的WSDL缓存文件。您可以在tmp目录中找到PHP WSDL缓存文件,前面加上wsdl
rm /tmp/wsdl-*
如果您使用PHP发出请求,则需要在客户端上的Magento服务器和上进行此操作。理想情况下,您应该在开发时关闭PHP的WSDL缓存。 Magento在CE版本1.7及更高版本中添加了执行此操作的功能。
System -> Configuration -> Magento Core API -> General Settings -> Enable WSDL Cache
通常,这由PHP ini设置soap.wsdl_cache_enabled
控制。 Magento的某些版本明确地将其关闭(上面的设置控制了这个),我看到很多Magento安装,其中人们改变了Magento的核心以保持 ,所以你可能想要做一些grep
通过代码。
最后,如果上述两个项目没有帮助,我将开始直接查看Magento发回的XML SOAP响应。具体而言,WSI API的XML内容在
中设置#File: app/code/core/Mage/Api/Model/Server/Wsi/Adapter/Soap.php
public function run()
{
//big code block to send response to a SOAP request here
return $this;
}
我会记录原始XML响应(再次,在部署之前将一些临时代码添加到您将删除的核心文件中)
#File: app/code/core/Mage/Api/Model/Server/Wsi/Adapter/Soap.php
public function run()
{
//big code block to send response to a SOAP request here
Mage::log($this->getController()->getResponse());
return $this;
}
并将您的“工作正常”示例与“不工作”示例进行比较,查找将您的值传递回Web服务客户端的XML字符。一个好的diff
计划在这里会有所帮助。
如果存在序列化问题,这将让您知道它是在Magento端还是在客户端库端发生的。