Magento API Extension仅在以编程方式设置结果集时返回null

时间:2013-06-11 15:23:37

标签: php xml api magento

好的,所以这对我来说很奇怪,我已经为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>

这些动态值没有返回,我做错了什么?有人有这方面的经验吗?

1 个答案:

答案 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端还是在客户端库端发生的。