Overview
Endpoint module is a framework which allows Drupal acts as a light endpoint.
The module was designed specifically for REST API. It contains a router that allows to follow REST style in your URLs. Here is an example:
GET /dogs
POST /dogs/create
DELETE /dogs/1
GET /dog/1
PUT /dog/1
Endpoint is really light, fast and flexible, that makes it a good solution for projects where Drupal role is mobile backend and single-page app backend.
Endpoint does not do anything itself but instead provides an API to other developers.
Prerequisites
Apache:
Add to your .htaccess file in the document root the following content:
# Rewrite API callback URLs of the form api.php?q=x.
RewriteCond %{REQUEST_URI} ^\/([a-z]{2}\/)?api\/.*
RewriteRule ^(.*)$ api.php?q=$1 [L,QSA]
RewriteCond %{QUERY_STRING} (^|&)q=(\/)?(\/)?api\/.*
RewriteRule .* api.php [L]
Nginx:
You may start from adding the following block to Nginx config:
# Rewrite API callback URLs of the form api.php?q=x.
location ^~ /api/ {
location ~* ^/api/ {
rewrite ^/(.*)$ /api.php?q=$1 last;
}
}
Note: this code doesn't take into account API versions.
Development
Create api.php file with the following content in your site document root and modify it as you need:
/**
* @file
*/
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/sites/all/modules/contrib/endpoint/includes/router.inc';
$routes = array(
'api/v1/foos' => array(
'GET' => array(
'callback' => 'my_module_foo_list',
'anonymous' => TRUE,
),
'POST' => array(
'callback' => 'my_module_foo_create',
),
),
'api/v1/foo/(\w+)' => array(
'GET' => array(
'callback' => 'my_module_foo_get',
),
'POST' => array(
'include' => DRUPAL_ROOT . '/sites/all/modules/custom/another_module/includes/some_callback.inc',
'callback' => 'my_module_foo_update',
),
),
);
endpoint_route(array(
'debug' => TRUE,
'routes' => $routes,
// 'authorize callback' => 'my_module_callback_authorize',
// 'error callback' => 'my_module_callback_error',
));
function my_module_foo_list() {
// ...
return array('foos' => $foo_collection);
}
function my_module_foo_create() {
$data = endpoint_request_data();
// ...
return array('foo' => $foo, 'bar' => $bar);
}
function my_module_foo_get($id) {
// ...
return array('foo' => $foo, 'bar' => $bar);
}
function my_module_foo_update() {
$data = endpoint_request_data();
// ...
}