Как настроить пользовательский API для Magento с SOAP V2? - PullRequest
4 голосов
/ 22 сентября 2011

Я использую Magento 1.4.1.1 и пытаюсь настроить пользовательскую функцию в API с использованием SOAP v2.У меня это работает для SOAP v1, но мне нужно v2, чтобы C # мог его использовать.Для версии v2 функция отображается в WSDL, но всегда возвращает эту ошибку: Процедура 'testFoo' отсутствует.

Вот мои файлы:

/ app / etc / modules / ABT_Test.xml

<?xml version="1.0"?>
<config>
    <modules>
        <ABT_Test>
            <active>true</active>
            <codePool>local</codePool>
        </ABT_Test>
    </modules>
</config>

/ app / code / local / ABT / Test / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <ABT_Test>
            <active>true</active>
            <codePool>local</codePool>
            <version>1.0</version>
        </ABT_Test>
    </modules>
    <global>
        <models>
            <test>
                <class>ABT_Test_Model</class>
            </test>
        </models>
    </global>
</config>

/ app/code/local/ABT/Test/etc/api.xml

<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <test>
                <model>test/api</model>
                <title>ABT Test Api</title>
                <methods>
                    <foo translate="title" module="test">
                        <title>Foo Test</title>
                        <method>foo</method>
                        <acl>test/foo</acl>
                    </foo>
                </methods>
            </test>
        </resources>
        <v2>
            <resources_function_prefix>
                <test>test</test>
            </resources_function_prefix>
        </v2>
    </api>
</config>

/ app / code / local / ABT / Test / etc / wsdl.xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:typens="urn:{{var wsdl.name}}" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"
    name="{{var wsdl.name}}" targetNamespace="urn:{{var wsdl.name}}">
    <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/" />
        </schema>
    </types>
    <message name="testFooRequest">
        <part name="sessionId" type="xsd:string" />
    </message>
    <message name="testFooResponse">
        <part name="result" type="typens:boolean" />
    </message>
    <portType name="{{var wsdl.handler}}PortType">
        <operation name="testFoo">
            <documentation>Test Foo</documentation>
            <input message="typens:testFooRequest" />
            <output message="typens:testFooResponse" />
        </operation>
    </portType>
    <binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
        <operation name="testFoo">
            <soap:operation soapAction="urn:{{var wsdl.handler}}Action" />
            <input>
                <soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </input>
            <output>
                <soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </output>
        </operation>
    </binding>
</definitions>

/ app / code / local / ABT / Test / Model / API.php

<?php
class ABT_Test_Model_Api extends Mage_Api_Model_Resource_Abstract
{

    public function foo()
    {
        return true;
    }
}
?>

/ app / code / local / ABT /Test / Model / API / V2.php

<?php
class ABT_Test_Model_Api_V2 extends ABT_Test_Model_Api
{
}
?>

А вот код, который я использую для тестирования API:

<?php
    $mageUser   = '########';
    $mageApiKey = '########';

    //SOAP V1
    echo "SOAP V1 <br />";
    $mageUrl    = 'http://www.########.com/api/soap/?wsdl';
    $soap = new SoapClient($mageUrl, array('cache_wsdl' => 0));

    try {
        $sessionID = $soap->login($mageUser, $mageApiKey);
        var_dump($soap->call($sessionID, 'test.foo', array()));
    } catch (Exception $e) {
        echo 'Exception: ' . $e->getMessage() . '<br />';
    }

    //SOAP V2
    echo "SOAP V2 <br />";
    $mageUrl2    = 'http://www.########.com/api/v2_soap/?wsdl';
    $soap2 = new SoapClient($mageUrl2, array('cache_wsdl' => 0));

    try {
        $sessionID2 = $soap2->login($mageUser, $mageApiKey);
        var_dump($soap2->testFoo($sessionID2));
    } catch (Exception $e) {
        echo 'Exception: ' . $e->getMessage() . '<br />';
    }
?>

Я скрыл имя пользователя, пароль и URL,Эта функция отображается в WSDL версии 2, и код php распознает, что она есть в WSDL, но я все еще получаю сообщение об ошибке: Процедура 'testFoo' отсутствует.

Так чего мне не хватает?

РЕДАКТИРОВАТЬ: Я сделал то, что предложил Зява, и это помогло моему примеру.Затем я скопировал папку и сделал точный (с учетом регистра) поиск и замену, чтобы использовать осмысленное имя модуля и имя функции.Я был осторожен, выбирая имена, которые, как я думал, не будут резервными словами.В новом модуле вызов на WSDL v1 работает нормально, но v2 выдает то же самое сообщение «Процедура« xxx »отсутствует».Затем я перешел и переименовал метод в тесте с «Foo» на «Fooz», и я получил это сообщение: «Путь к ресурсу не вызывается».Мне интересно, что я получил другое сообщение.Это наводит меня на мысль, что есть какой-то кеш / конфигурация / что-то, что вызывает проблему.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

Сначала я должен предупредить вас, что Magento пока не поддерживает формат SOAP v2, api / v2_soap /? Wsdl - просто вторая версия soap api .

1.

<models>
    <test>
        <class>ABT_Test_Model</class>
    </test>
</models>

Поскольку вы пишете модуль, который не является основным, вы должны написать <abt_test>

2. <model>test/api</model>.В вашем случае должно быть <model>abt_test/api</model>.

3. <acl>test/foo</acl>.

Существует ли этот раздел acl в вашем adminhtml.xml?

1 голос
/ 26 июня 2012

bygrace,

ваш код так совершенен!

add

....
  <resources_alias>
      <test>test</test>
  </resources_alias>
.....

того же уровня с

<resources> and <v2>

на Api.xml

, и он будет работать хорошо.

0 голосов
/ 29 сентября 2014

У меня возникла та же проблема, и я попытался очистить файл tmp, так как я размещал его с помощью xampp, он не работал, я получал Procedure ххх not present exception, мне пришлось отключить управление кэшем на странице администратора сервера.
Как отключить кэш на странице администратора
На странице администрирования в системе есть раздел под названием управление кешем: отключите все на этапе разработки, иначе любые изменения, которые вы не сделаетебыть отражено в WSDL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...