2011-09-22 50 views
4

我在Magento 1.4.1.1上,我嘗試在使用SOAP v2的API中設置自定義函數。我有它爲SOAP v1工作,但我需要V2,以便C#可以使用它。對於v2,該函數顯示在WSDL中,但alwasy返回此錯誤:過程'testFoo'不存在。如何使用SOAP V2爲Magento設置自定義api?

這裏是我的文件:

/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

​​

/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 />'; 
    } 
?> 

我模糊的用戶名,密碼和網址。該函數在v2 WSDL中顯示,並且php代碼識別它在WSDL中,但仍然出現錯誤:過程'testFoo'不存在。

那麼我錯過了什麼?

編輯: 我做了什麼Zyava建議,它得到了我的例子工作。然後我複製了該文件夾並做了一個確切的(區分大小寫的)查找和替換,以使用有意義的模塊名稱和函數名稱。我小心翼翼地選出我認爲不會保留的名字。在新模塊上,v1 WSDL上的調用工作正常,但v2給出了相同的「Procedure'xxx'not present」消息。然後,我將測試中的方法從'Foo'重命名爲'Fooz',然後我得到以下消息:「資源路徑不可調用。」我覺得有趣的是,我得到了不同的信息。這導致我相信有一些緩存/配置/導致問題的東西。有任何想法嗎?

回答

2

起初我應該警告你,Magento目前不支持SOAP v2格式,api/v2_soap /?wsdl只是second version of 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

對不起,你建議做的工作,但我有緩存問題。問題是服務器上的PHP WSDL緩存。我必須補充一點: '的ini_set( 'soap.wsdl_cache_enabled', '0');' – bygrace

+0

@Zyava我不明白,爲什麼要使用 abt_test/API而不是測試/ API?由於「測試」已被定義爲ABT_Test_Model。爲什麼仍然需要包含包名? – ivantedja

+0

對於非核心模塊來說,在任何地方都可以使用完整模塊名稱(包名)。 – Zyava

1

bygrace,

你的代碼太完美了!

上Api.xml

添加

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

同級別

<resources> and <v2> 

,它會工作良好。

0

我也有同樣的問題,我試圖清除tmp文件,因爲我一直在使用它的XAMPP沒有工作,我是越來越Procedure ххх not present exception託管它,我不得不服務器的管理頁面禁用緩存管理。
如何在管理頁面
禁用緩存在該系統下的管理頁面有一個叫做高速緩存管理部在開發階段,否則你就不會在WSDL中反映的任何變化都禁用。

相關問題