我在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',然後我得到以下消息:「資源路徑不可調用。」我覺得有趣的是,我得到了不同的信息。這導致我相信有一些緩存/配置/導致問題的東西。有任何想法嗎?
對不起,你建議做的工作,但我有緩存問題。問題是服務器上的PHP WSDL緩存。我必須補充一點: '的ini_set( 'soap.wsdl_cache_enabled', '0');' – bygrace
@Zyava我不明白,爲什麼要使用 abt_test/API 而不是測試/ API ?由於「測試」已被定義爲ABT_Test_Model。爲什麼仍然需要包含包名? –
ivantedja
對於非核心模塊來說,在任何地方都可以使用完整模塊名稱(包名)。 – Zyava