1

好的,所以这对我来说很奇怪,我已经向 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'ing 客户模型——以确保它得到结果,并且数据元素在那里。我尝试将响应从数组更改为单个字符串元素,并且得到相同的结果。

我最初认为这可能是数据类型问题,因为我使用的是符合 WSI 的 V2 API。但是我将响应类型从 int 更改为字符串(当我在独立代码中 var_dump 数组时得到一个字符串),但这似乎也不起作用。我肯定会在 API 中收到“oms_id”——一个自定义属性,因为我可以直接将它传回,然后在响应中取回它。我尝试通过几种不同的方式从模型中获取我想要的值,没有一种方法可以从 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>

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

4

1 回答 1

0

对此没有直接经验,但我不得不调试几个类似的问题。这里有一些提示可以帮助您追踪这一点。

首先,我知道您的三次检查您的代码是否返回了您认为返回的内容,但我会要求您进行四次检查。具体来说,不是在单独的 PHP 文件中运行代码,而是记录实际 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;

    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-*

这需要在 Magento 服务器上发生,如果您使用 PHP 发出请求,则在客户端上发生。理想情况下,您应该在开发时关闭 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 端还是在您的客户端库端。

于 2013-06-11T16:26:16.187 回答