8

So I followed this example for creating custom api. But I am not sure if I am calling it wrong or my code is not correct. Here is what I have.

Folder structure:

Mycompany
    Syncreports
      etc
        api.xml
        wsi.xml
        wsdl.xml
      Model
        Sync
          Api
            V2.php
          Api.php

/app/etc/modules/Mycompany_Syncreports.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Mycompany_Syncreports>
            <active>true</active>
            <codePool>local</codePool>
    <depends>
                <Mage_Api />
            </depends>
        </Mycompany_Syncreports>
    </modules>
</config>

/app/code/local/Mycompany/Syncreports/etc/api.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Mycompany_Syncreports>
          <version>1.0.0</version>
        </Mycompany_Syncreports>
    </modules>
  <api>
      <resources>
        <syncreports_sync translate="title" module="mycompany_syncreports">
            <title>Synchronization API</title>
            <model>syncreports/sync_api</model>
            <acl>syncreports/sync</acl>
            <methods>
                <info translate="title" module="mycompany_syncreports">
                    <title>Retrieve synchronization info</title>
                    <acl>syncreports/sync/info</acl>
                    <method>info</method>
                </info>
            </methods>
            <faults module="mycompany_syncreports">
                <project_not_exists>
                    <code>101</code>
                    <message>Requested project does not exist.</message>
                </project_not_exists>
                <invalid_data>
                    <code>102</code>
                    <message>Provided data is invalid.</message>
                </invalid_data>
                <save_error>
                    <code>103</code>
                    <message>Error while saving project. Details in error message.</message>
                </save_error>
                <remove_error>
                    <code>104</code>
                    <message>Error while removing project. Details in error message.</message>
                </remove_error>
            </faults>
        </syncreports_sync>
    </resources>
    <resources_alias>
        <sync>syncreports_sync</sync>
    </resources_alias>
    <v2>
        <resources_function_prefix>
            <sync>syncreportsSync</sync>
        </resources_function_prefix>
    </v2>
    <acl>
        <resources>
            <syncreports translate="title" module="mycompany_syncreports">
                <title>SyncReports</title>
                <sync translate="title" module="mycompany_syncreports">
                    <title>Synchronization</title>
                    <sort_order>110</sort_order>
                    <info translate="title" module="mycompany_syncreports">
                        <title>Info</title>
                    </info>
                </sync>
            </syncreports>
        </resources>
    </acl>
  </api>
</config>

/app/code/local/Mycompany/Syncreports/etc/wsi.xml

<?xml version="1.0" encoding="UTF-8"?>
<wsdl: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/"
 name="{{var wsdl.name}}"
 targetNamespace="urn:{{var wsdl.name}}">
<wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:{{var wsdl.name}}">
        <xsd:complexType name="syncreportsSyncInfoEntity">
            <xsd:sequence>
                <xsd:element name="entity_id" type="xsd:string" />
                <xsd:element name="name" type="xsd:string" />
                <xsd:element name="description" type="xsd:string" />
                <xsd:element name="status" type="xsd:string" />
                <xsd:element name="created_at" type="xsd:string" />
                <xsd:element name="updated_at" type="xsd:string" />
            </xsd:sequence>
        </xsd:complexType>
        <xsd:element name="syncreportsSyncInfoRequestParam">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element minOccurs="1" maxOccurs="1" name="sessionId" type="xsd:string" />
                    <xsd:element minOccurs="1" maxOccurs="1" name="projectId" type="xsd:string" />
                </xsd:sequence>
             </xsd:complexType>
        </xsd:element>
        <xsd:element name="syncreportsSyncInfoResponseParam">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element minOccurs="1" maxOccurs="1" name="result" type="typens:portfolioProjectInfoEntity" />
                </xsd:sequence>
             </xsd:complexType>
        </xsd:element>
    </xsd:schema>
</wsdl:types>
<wsdl:message name="syncreportsSyncInfoRequest">
    <wsdl:part name="parameters" element="typens:syncreportsSyncInfoRequestParam" />
</wsdl:message>
<wsdl:message name="syncreportsSyncInfoResponse">
    <wsdl:part name="parameters" element="typens:syncreportsSyncInfoResponseParam" />
</wsdl:message>
<wsdl:portType name="{{var wsdl.handler}}PortType">
    <wsdl:operation name="syncreportsSyncInfo">
        <wsdl:documentation>Retrieve project info</wsdl:documentation>
        <wsdl:input message="typens:syncreportsSyncInfoRequest" />
        <wsdl:output message="typens:syncreportsSyncInfoResponse" />
    </wsdl:operation>

</wsdl:portType>
<wsdl:binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="syncreportsSyncInfo">
        <soap:operation soapAction="" />
        <wsdl:input>
            <soap:body use="literal" />
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" />
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="{{var wsdl.name}}Service">
    <wsdl:port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding">
        <soap:address location="{{var wsdl.url}}" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

/app/code/local/Mycompany/Syncreports/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/" />
        <complexType name="syncreportsSyncInfoEntity"><!-- define type for retrieve info -->
            <all>
                <element name="entity_id" type="xsd:string" minOccurs="1" />
                <element name="name" type="xsd:string" minOccurs="1" />
                <element name="description" type="xsd:string" minOccurs="0" />
                <element name="status" type="xsd:string" minOccurs="0" />

                <element name="created_at" type="xsd:string" minOccurs="1" />
                <element name="updated_at" type="xsd:string" minOccurs="1" />
            </all>
        </complexType>
    </schema>
</types>
<message name="syncreportsSyncInfoRequest">
    <part name="sessionId" type="xsd:string" />
    <part name="projectId" type="xsd:string" />
</message>
<message name="syncreportsSyncInfoResponse">
    <part name="result" type="typens:syncreportsSyncInfoEntity" />
</message>
<portType name="{{var wsdl.handler}}PortType">
    <operation name="syncreportsSyncInfo">
        <documentation>Retrieve project info</documentation>
        <input message="typens:syncreportsSyncInfoRequest" />
        <output message="typens:syncreportsSyncInfoResponse" />
    </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="syncreportsSyncInfo">
        <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>

/app/code/local/Mycompany/Syncreports/Model/Sync/Api.php

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

/app/code/local/Mycompany/Syncreports/Model/Sync/Api/V2.php

<?php
class Mycompany_Syncreports_Model_Sync_Api_V2 extends Mycompany_Syncreports_Model_Sync_Api{

  public function info($projectId){
    return "This is the message: ".$projectId;
  }
}

And this is how I am calling my api:

<?php
$host = "127.0.0.1/magento/index.php";
$client = new SoapClient("http://".$host. "/api/soap/?wsdl");
$apiuser= "user";
$apikey = "123456";
$action = "syncreports.info";

try { 
    $session_id= $client->login($apiuser, $apikey);
$result = array();

$result= $client->call($session_id, $action, array("test"));
    var_dump($result);
}
catch (Exception $e){
    echo var_dump($e);
    throw $e;
}
?>

Using this coad I am getting error: Fatal error: Uncaught SoapFault exception: [3] Invalid api path

Any ideas how I should solve this ?


/app/code/local/Mycompany/Syncreports/etc/config.xml

<?xml version="1.0" ?>
<config>
  <modules>
    <Mycompany_Syncreports>
        <version>1.0.0</version>
    </Mycompany_Syncreports>
</modules>
<global>
    <helpers>
        <mycompany_syncreports>
            <class>Mycompany_Syncreports_Helper</class>
        </mycompany_syncreports>
    </helpers>
</global>   
<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <foo_bar before="Mage_Adminhtml">Mycompany_Syncreports_Adminhtml</foo_bar>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

<frontend>
    <routers>
        <syncreports>
            <use>standard</use>
            <args>
                <module>Mycompany_Syncreports</module>
                <frontName>syncreports</frontName>
            </args>
        </syncreports>
    </routers>
</frontend>

<adminhtml>
    <layout>
        <updates>
            <syncreports>
                <file>mycompany/syncreports.xml</file>
            </syncreports>
        </updates>
    </layout>
</adminhtml>    
</config>

3 Answers 3

6

Your action name should be

$action = 'syncreports_sync.info';

In general here is how an API v1 method name should look.

entity_alias.method
   |           |
   |           |------------the name of the method to call.Child of the `<methods>` tag in the `api.xml` file
   |  
   |--- the tag name you specified in `api.xml` inside the `<resources>` tag

[EDIT]
Your other issue is caused by the fact that you are missing the model declarations in config.xml.
Add this inside the <global> tag

<models>
    <syncreports>
        <class>Mycompany_Syncreports_Model</class>
    </syncreports>
</models>

If you want to use mycompany_syncreports as a model alias just like you do for helpers put this xml instead of the above

<models>
    <mycompany_syncreports>
        <class>Mycompany_Syncreports_Model</class>
    </mycompany_syncreports>
</models>

But in this case you need to modify your api.xml.
Change this line:

<model>syncreports/sync_api</model>

To this one

<model>mycompany_syncreports/sync_api</model>
6
  • Thank you Marius a lot for your answer. I changed my action as you told me. But now I am getting another error: Fatal error: Uncaught SoapFault exception: [4] Resource path is not callable. Do you have an idea what can cause this error?
    – intentarr
    Commented Feb 10, 2014 at 15:55
  • @intentarr. The exception is thrown in Mage_Api_Model_Server_Handler_Abstract. look for the code throw new Mage_Api_Exception('resource_path_not_callable');. You can debug from there. There are 4 such occurrences. Most probably your models are not configured correctly. Add the config.xml of your module to the question. That can clear things up
    – Marius
    Commented Feb 10, 2014 at 15:59
  • I added config.xml file and I will also look for resource_path_not_callable exception.
    – intentarr
    Commented Feb 10, 2014 at 16:08
  • @intentarr. See the update to my answer. It was too large to add in a comment.
    – Marius
    Commented Feb 10, 2014 at 16:11
  • @Marius Thanks, $action = 'syncreports_sync.info'; This explanation also helped me.
    – Mukesh
    Commented Oct 24, 2014 at 12:53
0

I am also having same issue(invalid API Path). Please anyone know let answer me.. Here is my Code What i did??

api.xml

<resources>

  <arb translate="title" module="mymodule">

    <title>Chiragdodia module</title>

    <model>mymodule/api</model>

    <methods>

      <storesList translate="title" module="mymodule">
        <title>Retrieve list of installed stores</title>
        <acl>arb/storesList</acl>
      </storesList>

    </methods>


  </arb>
</resources>
<acl>
  <resources>
    <arb translate="title" module="mymodule">
      <title>arb</title>
      <create translate="title" module="mymodule">
        <title>Create product</title>
      </create>

    </arb>
  </resources>
</acl>
  <v2>
  <resources_function_prefix>
    <arb>arb</arb>
  </resources_function_prefix>
</v2>

config.xml

1.1.65

<global>
    <helpers>
        <mymodule>
            <class>Chiragdodia_Mymodule_Helper</class>
        </mymodule>
    </helpers>
    <models>
        <catalog>
            <rewrite>
                <category_api>Chiragdodia_Mymodule_Model_Category_Api</category_api>
                <product_api>Chiragdodia_Mymodule_Model_Product_Api</product_api>
                <product_attribute_api>Chiragdodia_Mymodule_Model_Product_Attribute_Api</product_attribute_api>
                <product_attribute_media_api>Chiragdodia_Mymodule_Model_Product_Attribute_Media_Api</product_attribute_media_api>
                <product_link_api>Chiragdodia_Mymodule_Model_Product_Link_Api</product_link_api>
            </rewrite>
        </catalog>
        <core>
            <rewrite>
                <url>Chiragdodia_Mymodule_Model_Core_Url</url>
                <store>Chiragdodia_Mymodule_Model_Core_Store</store>
            </rewrite>
        </core>
        <mymodule>
            <class>Chiragdodia_Mymodule_Model</class>
        </mymodule> 
    </models>
</global>

0

resourcename should not be same like in following api.xml

<rescustomapi> is my resourcename while customapi is my module name. May be you have both names are same.

<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <rescustomapi translate="title" module="customapi">
                <model>customapi/helloworld_api</model>
                <title>Custom HelloWorld API</title>
                <methods>
                   <setddapi translate="title" module="customapi">
                        <title>Mydons HelloWorld API</title>
                   </setddapi>
                </methods>
                <faults module="customapi">
                    <data_invalid>
                        <code>100</code>
                        <message>Invalid data</message>
                    </data_invalid>
                </faults>
            </rescustomapi>
          </resources>
      </api>
</config>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.