Custom Rest Api in Magento

Question

I need rest api to create customer in magneto for that I followed this tutorial http://www.authenticdesign.co.uk/extending-magento-rest-api-v2/

I followed it step by step, But When I test the api on rest client it give me: {"messages":{"error":[{"code":404,"message":"Request does not match any route."}]}}

I do not have any idea where I am making mistake. Help me out here as I am very new to magento as well as for php.

The steps are:

1. Enabled Extension at (app/etc/module/Custom_Restapi.xml)

<config>
    <modules>
        <Custom_Restapi>
            <active>true</active>
            <codePool>local</codePool>
        </Custom_Restapi_Groups>
    </modules>
</config>

2. config.xml at (app/code/local/Custom/Restapi/etc/config.xml)

   <?xml version="1.0"?>
<config>
    <modules>
        <Custom_Restapi>
            <version>0.1.0.0</version>
        </Custom_Restapi>
    </modules>
    <global>
        <models>
            <restapi>
                <class>Custom_Restapi_Model</class>
            </restapi>
        </models>
    </global>
</config>

3. api2.xml at (app/code/local/Custom/Restapi/etc/api2.xml)

<?xml version="1.0"?>
<config>
    <api2>
        <resource_groups>
            <restapi translate="title" module="Custom_Restapi">
                <title>Custom Rest API</title>
                <sort_order>10</sort_order>
            </restapi>
        </resource_groups>
        <resources>
            <restapi translate="title" module="Custom_Restapi">
                <group>restapi</group>
                <model>restapi/api2_restapi</model>
                <title>Testing My Rest API</title>
                <sort_order>10</sort_order>
                <privileges>
                    <admin>
                        <create>1</create>
                    </admin>
                </privileges>
                <attributes  translate="" module="Custom_Restapi">
                    <firstname>First Name</firstname>
                    <lastname>Last Name</lastname>
                    <email>Email</email>
                    <password>Password</password>
                </attributes>
               <routes>
                    <route>
                        <route>/customer</route>
                        <action_type>collection</action_type>
                    </route>
                </routes>
                <versions>1</versions>
            </restapi>
        </resources>
    </api2>
</config>

4. Model Class Restapi.php at (app/code/local/Custom/Restapi/Model/Api2/Restapi.php)

<?php

class Custom_Restapi_Model_Api2_Restapi extends Mage_Api2_Model_Resource
{

}

?>

5. V1.php at (app/code/local/Custom/Restapi/Model/Api2/Restapi/Rest/Admin/V1.php)

<?php
class Custom_Restapi_Model_Api2_Restapi_Rest_Admin_V1 extends Custom_Restapi_Model_Api2_Restapi
{

    /**
     * Create a customer
     * @return array
     */

    public function _create() {

        $requestData = $this->getRequest()->getBodyParams();
        $firstName = $requestData['firstname'];
        $lastName = $requestData['lastname'];
        $email = $requestData['email'];
        $password = $requestData['password'];

        $customer = Mage::getModel("customer/customer");

        $customer->setFirstname($firstName);
        $customer->setLastname($lastName);
        $customer->setEmail($email);
        $customer->setPasswordHash(md5($password));
        $customer->save();

       return  json_encode(array("testing","Success"));
   }

}
?>

And my url is like : baseurl/api/rest/customer

Solution

I would put this in a comment since I feel this is not a fully complete answer, but I am not yet allowed to. A few things:

  1. Your global tag in config.xml is not closed.

  2. You cannot create records using a url that references entities, you have to use the collection route defined in the route_collection node in api2.xml. So you should be calling /api/rest/customer.

  3. There is no need to have a separate "create" route since the method is chosen by the http method (post/get/delete/etc) and the body content. I would recommend a route of "customer/:id" for the route_entity element. So also be sure that you are submitting an HTTP POST.

I was not able to reproduce the exact error you posted, but I was able to get this working after correcting the above items.

Also, be sure to give permission on this resource in the admin area and to clear your Web Services config caches.

The specific exception you listed is thrown in Mage_Api2_Model_Router in the route method.

I reworked this and created a repo on github with the working module: https://github.com/themizzi/Custom-Magento-Rest-Api2. The module uses Guest access since I didn't have time to go through the whole oAuth deal, but if you simply update the guest node in api2.xml to admin and update your access in the admin area, it will work.