2012-08-29 19 views
13

Soy nuevo en Magento y me gustaría crear un método propio de API v2. he construido un proyecto simple ...
Magento API: Publicar un nuevo método en soap V2

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


Estos son los principales archivos ...
(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; 
} 
?> 

utilizando la siguiente dirección, el resultado es:

.../test.php/ver = 1

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

Es decir:? V1 usando jabón, el método ¡trabajos!. ?

Pero si uso la llamada jabón v2 ...

.../test.php/ver = 2 el resultado es:

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 


El papel tiene acceso a todos los recursos de API ...

No sé lo que está mal? ¿Hay alguien que me puede ayudar con este problema? ¿Puede haber algo relacionado con acl's? Gracias de antemano !!!

+1

tal vez que la memoria caché wsdl está habilitada o PHP y otros clientes almacenan en caché la wsdl. para asegurarse de que 'sudo rm -rf/tmp/wsdl *' ejecute este comando en un terminal. –

Respuesta

1

¡Su código es excelente! no hay error en

Por lo que sé (según mi experiencia). esa excepción se muestra porque la ubicación de la etiqueta en su api.xml no coincide con la función llamada.


comprobación de archivos

núcleo \ Mago \ Catálogo \ Model \ Producto \ Api.php

y

núcleo \ Mago \ Catálogo \ Model \ Producto \ Api \ V2.php

hay una función llamada artículos tanto en clase.

quizá debe agregar el código en api_v1 en api_v2 clase como esta:

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

o

tal vez es caché.

El caché es fuerte, porque es API V2. intente borrar su caché en:

  1. admin -> sistema -> gestión de memoria caché -> clear magento cache.
  2. intente borrar el caché wsdl.xml en /tmp/wsdl.xml (oculto en su servidor) intente grep.
  3. eliminar todos los archivos en var/log/*
+2

Muchas gracias Josua.
He resuelto el problema. Hubo problemas con el nombre del método en el archivo wsdl y problemas con la ruta en el api.xml. –

7

Es un problema de la ruta.
he resolver los problemas de la siguiente manera ...
La estructura de carpetas de mi proyecto es:

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> 

Tenga en cuenta el nombre del método api "myapimethod" y la carpeta "Modelo \ Carpeta".

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

El nombre del método API debe ser: folderMethodname", donde "carpeta" es el nombre de la carpeta en el "modelo" donde el método de la API se declara .., en nuestro caso: "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) de prueba.php

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

Esta línea muestra cómo llamar a mi método de la API ...

Funciona!

+0

buen código. pero para mí no funciona :( –

+0

@ArulJames Funciona, pero tal vez estés ejecutando una API en el modo de cumplimiento WS-I. En ese caso, también necesitas las definiciones wsi.xml –

Cuestiones relacionadas