2012-08-29 7 views
13

Magentoで新しく、独自のAPI v2メソッドを作成したいと思います。私は単純なプロジェクトを構築しました ...
Magento API:新しいメソッドをSOAP V2に公開

Mycompany 
    Mymodule 
     etc 
      api.xml 
      config.xml 
      wsdl.xml 
     Model 
      Api 
       V2.php 
      Api.php 


これらは主なファイルです...

<config> 
    <api> 
     <resources> 
      <mymodule translate="title" module="mymodule"> 
       <title>mymodule</title> 
       <model>mymodule/api</model> 
       <methods>      
        <myapimethod translate="title" module="mymodule"> 
         <title>myapimethod</title> 
         <acl>mymodule/myapimethod</acl> 
        </myapimethod> 
       </methods> 
      </mymodule> 
     </resources> 
     <v2> 
      <resources_function_prefix> 
       <mymodule>mymodule</mymodule> 
      </resources_function_prefix> 
     </v2> 
     <acl> 
      <resources> 
       <mymodule translate="title" module="mymodule"> 
        <title>Mymodule</title> 
        <sort_order>2000</sort_order>      
        <myapimethod translate="title" module="mymodule"> 
         <title>myapimethod</title> 
        </myapimethod> 
       </mymodule> 
      </resources> 
     </acl> 
    </api> 
</config> 


(1)api.xml

(2)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="myapimethodRequest"> 
     <part name="sessionId" type="xsd:string"/> 
     <part name="message" type="xsd:string" /> 
    </message> 
    <message name="myapimethodResponse"> 
     <part name="result" type="xsd:string" /> 
    </message> 
    <portType name="{{var wsdl.handler}}PortType"> 
     <operation name="myapimethod"> 
      <documentation>this is an example of api method...</documentation> 
      <input message="typens:myapimethodRequest" /> 
      <output message="typens:myapimethodResponse" /> 
     </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="myapimethod"> 
      <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> 
    <service name="{{var wsdl.name}}Service"> 
     <port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding"> 
      <soap:address location="{{var wsdl.url}}" /> 
     </port> 
    </service> 
</definitions> 

(3)Api.php

<?php 
class Mycompany_Mymodule_Model_Api extends Mage_Api_Model_Resource_Abstract 
{   
     public function myapimethod($sessionId, $message) 
     { 
      return "This is the message : ".$message; 
     } 
} 

(4)V2.php

<?php 
class Mycompany_Mymodule_Model_Api_V2 extends Mycompany_Mymodule_Model_Api 
{   

} 

(5)test.phpを

<?php 
try { 
    define("SOAP_WSDL",'http://localhost:8080/magento/index.php/api/?wsdl'); 
    define("SOAP_WSDL2",'http://localhost:8080/magento/index.php/api/v2_soap?wsdl=1'); 
    define("SOAP_USER","dtsSoapUser"); 
    define("SOAP_PASS","casares"); 

    if($_GET['ver'] == '2') { 
     $client = new SoapClient(SOAP_WSDL2, array('trace' => 1,'cache_wsdl' => 0)); 
     echo "<br>version 2 <br>"; 
    } 
    else { 
     $client = new SoapClient(SOAP_WSDL,array('trace' => 1,'cache_wsdl' => 0)); 

     echo "<br>version 1 <br>"; 
    } 
    $session = $client->login(SOAP_USER, SOAP_PASS); 
    $result = array(); 

    try { 
     if($_GET['ver'] == '2') { 
      $result = $client->Myapimethod($session, "My message...."); 
      var_dump ($result);   
     } else {    
      $result= $client->call($session, 'mymodule.myapimethod', array($session, "My message ....")); 
      var_dump($result); 
     } 
    } catch (SoapFault $exception) { 
     echo 'EXCEPTION='.$exception; 
    } 

    echo "<br>end test<br>"; 
} catch (Exception $e){ 
    echo var_dump($e); 
    throw $e; 
} 
?> 
次のURLを使用して

、結果は次のとおりです。

.../test.phpを/版= 1

version 1 
string 'This is the message : My message ....' (length=37) 
end test 
それは言うことです

:?ソープV1を使用して、方法作品! ?

しかし、私は石鹸v2の呼び出しを使用している場合...

.../test.phpを/版= 2 結果は次のとおりです。

version 2 
EXCEPTION=SoapFault exception: [3] Invalid api path. in C:\wamp\www\PruebasPHP\test.php:22 Stack trace: #0 C:\wamp\www\PruebasPHP\test.php(22): SoapClient->__call('Myapimethod', Array) #1 C:\wamp\www\PruebasPHP\test.php(22): SoapClient->Myapimethod('b9e1e8d15a61398...', 'My message....') #2 {main} 
end test 


役割すべてのAPIリソースにアクセスできます。

何が間違っているのですか?誰もこの問題で私を助けることができますか? aclに関連するものは何でもかまいませんか? 事前に感謝!

+1

wsdlキャッシュが有効になっているか、PHPなどのクライアントがwsdlをキャッシュしている可能性があります。 'sudo rm -rf/tmp/wsdl *'がターミナルでこのコマンドを実行していることを確認してください。 –

答えて

1

コードは優れています!

私の知る限りで(私の経験から)。この例外は、api.xmlのタグの配置がfunctionと呼ばれるものと一致しないために表示されます。ファイル

コアの\メイジ\カタログ\モデル\製品\ APIに


チェック。PHP

コアの\メイジ\カタログ\モデル\製品\アピ\ V2.php

両方のクラスに項目という名前の関数があります。

多分あなたは、このようなapi_v2クラスにapi_v1にあなたのコードを追加する必要があります

<?php 
class Mycompany_Mymodule_Model_Api_V2 extends Mycompany_Mymodule_Model_Api 
{   
    public function myapimethod($sessionId, $message) 
    { 
     return "This is the message : ".$message; 
    } 
} 

または

は、多分それは、 キャッシュです。

API V2であるため、キャッシュは強力です。キャッシュをクリアしてください:

  1. admin - >システム - >キャッシュ管理 - >クリアマゼンタキャッシュ。
  2. /tmp/wsdl.xml(サーバーには表示されません)のwsdl.xmlキャッシュをクリアしてみてください。grepです。
  3. は、それがパスの問題だ/ *
+2

ありがとうJosua。
私はこの問題を解決しました。 wsdlファイルのメソッド名に問題があり、api.xmlのパスに問題がありました。 –

7

ログは/ var上のすべてのファイルを削除します。
私は、次のような問題を解決しました ...
私のプロジェクトのフォルダ構造は次のとおりです。へ

Mycompany-> 
    Mymodule-> 
     etc-> 
      api.xml 
      config.xml 
      wsdl.xml 
      wsi.xml 
     Model-> 
      Folder-> 
       Api.php 
       Api-> 
        V2.ph 

(1)api.xml

<?xml version="1.0"?> 
<config> 
    <api> 
     <resources> 
      <mymodule_folder translate="title" module="mymodule"> 
       <title>mymodule</title> 
       <!-- acl>mymodule/api</acl>--> 
       <model>mymodule/folder_api</model> 
       <acl>mymodule/folder</acl> 
       <methods>      
        <myapimethod translate="title" module="mymodule"> 
         <title>myapimethod</title> 
         <acl>mymodule/folder/myapimethod</acl> 
        </myapimethod> 
       </methods> 
      </mymodule_folder> 
     </resources> 
     <resources_alias> 
      <folder>mymodule_folder</folder> 
     </resources_alias> 

     <v2> 
      <resources_function_prefix> 
       <folder>folder</folder> 
      </resources_function_prefix> 
     </v2> 
     <acl> 
      <resources> 
       <mymodule translate="title" module="mymodule"> 
        <title>mymodule</title> 
        <sort_order>1</sort_order> 
        <folder translate="title" module="mymodule"> 
         <title>Folder</title> 
         <sort_order>2000</sort_order>      
       <myapimethod translate="title" module="mymodule"> 
          <title>myapimethod</title> 
         </myapimethod> 
        </folder> 
      </mymodule> 
      </resources> 
     </acl> 
    </api> 
</config> 

ご注意ください"myapimethod"および"Model \ Folder"の名前です。

(2)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="folderMyapimethodRequest"> 
     <part name="sessionId" type="xsd:string"/> 
     <part name="message" type="xsd:string" /> 
    </message> 
    <message name="folderMyapimethodResponse"> 
     <part name="result" type="xsd:string" /> 
    </message> 
    <portType name="{{var wsdl.handler}}PortType"> 
     <operation name="folderMyapimethod"> 
      <documentation>this is an example of api method...</documentation> 
      <input message="typens:folderMyapimethodRequest" /> 
      <output message="typens:folderMyapimethodResponse" /> 
     </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="folderMyapimethod"> 
      <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> 
    <service name="{{var wsdl.name}}Service"> 
     <port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding"> 
      <soap:address location="{{var wsdl.url}}" /> 
     </port> 
    </service> 
</definitions> 

APIメソッドの名前でなければならない:フォルダがモデル "場所 "の下にフォルダの名前である" folderMethodname」、" APIメソッドが宣言されている..私たちの場合には: "folderMyapimethod"
(3)api.php

<?php 
class Mycompany_Mymodule_Model_Folder_Api extends Mage_Api_Model_Resource_Abstract 
{   
     public function myapimethod($message) 
     { 
      return "This is the message: ".$message; 
     } 
} 

(4)V2.php

<?php 
class Mycompany_Mymodule_Model_Folder_Api_V2 extends Mycompany_Mymodule_Model_Folder_Api 
{ 
    //empty  
} 


(5)試験。PHP

$result = $client->folderMyapimethod($session,$message); 

この行は私のAPIメソッドを呼び出す方法を示しています...

それは働きます!

+0

すてきなコード。しかし私のために働いていません:( –

+0

@ArulJamesそれは動作しますが、WS-I準拠モードでapiを実行している可能性があります。その場合は、wsi.xml定義も必要です –

関連する問題