2012-08-29 16 views
13

में एक नई विधि प्रकाशित करें मैं Magento में नया हूं और मैं अपना स्वयं का एपीआई v2 विधि बनाना चाहता हूं। मैं एक साधारण परियोजना का निर्माण किया है ...
Magento API: साबुन V2

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


इन मुख्य फ़ाइलें हैं ...
(1) api.xml

<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> 

(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; 
} 
?> 

निम्नलिखित यूआरएल का उपयोग करना, परिणाम है:

.../test.php/ver = 1

version 1 
string 'This is the message : My message ....' (length=37) 
end test 

यह कहना है: साबुन v1 का उपयोग कर, विधि काम करता है !. ?

लेकिन अगर मैं साबुन वी 2 कॉल का उपयोग करें ...

.../test.php/ver = 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 


भूमिका सभी एपीआई संसाधनों तक पहुंच है ...

मुझे नहीं पता कि क्या गलत है? इस समस्या में मेरी कोई मदद कर सकता है? एसीएल से संबंधित कुछ भी हो सकता है? अग्रिम धन्यवाद !!!

+1

शायद यह है कि wsdl कैश सक्षम है या PHP और अन्य क्लाइंट wsdl को कैश करते हैं। यह सुनिश्चित करने के लिए कि 'sudo rm -rf/tmp/wsdl *' टर्मिनल पर यह आदेश चलाएं। –

उत्तर

1

आपका कोड उत्कृष्ट है!

पर कोई गलती नहीं है, जहां तक ​​मुझे पता है (मेरे अनुभव से)। उस अपवाद को दिखाया गया है क्योंकि आपके api.xml पर आपका टैग प्लेसमेंट आपके साथ फ़ंक्शन नामक मेल नहीं खाता है। फाइलों पर


जांच

कोर \ दाना \ सूची \ मॉडल \ उत्पाद \ एपीआई।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; 
    } 
} 

या

शायद यह कैश है।

कैश मजबूत है, क्योंकि यह एपीआई वी 2 है। अपने कैश को साफ़ करने का प्रयास करें:

  1. व्यवस्थापक -> सिस्टम -> कैश प्रबंधन -> स्पष्ट Magento कैश।
  2. /tmp/wsdl.xml (अपने सर्वर पर छिपा हुआ) पर wsdl.xml कैश को साफ़ करने का प्रयास करें grep पर आज़माएं।
  3. वर पर सभी फ़ाइलों को हटाने/log/*
+2

बहुत बहुत धन्यवाद जोशुआ।
मैंने समस्या हल कर ली है। Wsdl फ़ाइल में विधि के नाम और api.xml में पथ के साथ समस्याएं थीं। –

7

यह पथ के एक समस्या है।
मैं समस्याओं का समाधान के रूप में निम्नानुसार है ...
अपने प्रोजेक्ट के फ़ोल्डर संरचना है:

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" और फ़ोल्डर "मॉडल \ फ़ोल्डर"

(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 यह काम करता है लेकिन शायद आप डब्ल्यूएस-आई अनुपालन मोड में एपीआई चला रहे हैं। उस स्थिति में आपको wsi.xml परिभाषाओं की भी आवश्यकता है –

संबंधित मुद्दे