Я на Magento 1.4.1.1, и я пытаюсь настроить пользовательскую функцию в API с помощью SOAP v2. У меня он работает для SOAP v1, но мне нужен v2, чтобы C # мог его использовать. Для v2 функция появляется в WSDL, но alwasy возвращает эту ошибку: процедура «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. Функция отображается в v2 WSDL, а код php распознает, что он находится в WSDL, но я все еще получаю ошибку: процедура «testFoo» отсутствует.
Так что я пропущу?
EDIT: Я сделал то, что предложил Зява, и это показало мой пример. Затем я скопировал папку и сделал точный (чувствительный к регистру) поиск и замену для использования значимого имени и имени модуля. Я был осторожен, чтобы выбрать имена, которые, как я думал, не были бы резервными словами. В новом модуле вызов WSDL v1 работает отлично, но v2 дает то же сообщение «Процедура» xxx «нет». Затем я отправил и переименовал метод в тесте с «Foo» на «Fooz», и я получил это сообщение: «Путь к ресурсу не вызываем». Мне интересно, что я получаю другое сообщение. Это заставляет меня думать, что есть некоторый кеш / конфигурация / что-то, что вызывает проблему. Есть идеи?
Сначала я должен предупредить вас, что Magento сейчас не поддерживает формат SOAP v2, api / v2_soap /? Wsdl – это только вторая версия мыла 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?
по благодати,
ваш код настолько совершенен!
Добавить
.... <resources_alias> <test>test</test> </resources_alias> .....
одинаковый уровень с
<resources> and <v2>
на Api.xml
и он будет работать хорошо.
У меня есть одна и та же проблема, и я попытался очистить файл tmp, поскольку я разместил его с помощью xampp, он не работал, я получал Procedure ххх not present exception
, мне пришлось отключить управление кешем на странице администрирования сервера .
Как отключить кеш на странице администратора
На странице администрирования в системе есть раздел, называемый управлением кэшем, который отключает все на этапе разработки, или любые изменения, которые вы не будете отражать в wsdl.