CodeIgniter RestServer

[Série RestServer] Criando um RestServer com CodeIgniter – Banco de Dados e Rotas

Nos dois primeiros posts da série vimos em linhas gerais como construir a estrutura base para o RestServer, assim como verbos HTTP GET, POST, PUT e DELETE e a forma como o CodeIgniter lida com as requisições feitas ao RestServer.

A partir desse artigo vamos construir um RestServer para aplicarmos os recursos disponibilizados pelo código do Chris Kacerguis.

Se você não leu os artigos anteriores, faça a leitura deles antes de prosseguir, assim você não terá dificuldades no passo-a-passo da construção do RestServer.

Sobre o RestServer de exemplo

Para que seja possível assimilar facilmente as funcionalidades e recursos de um RestServer construído com CodeIgniter em um curto espaço de tempo, vamos utilizar uma única tabela de dados, e nela concentraremos todas as operações de CRUD usando os métodos GET, POST, PUT e DELETE.

As telas para poder listar, criar, editar e remover os registros serão criadas usando o Bootstrap, e as interações assim como as requisições AJAX serão feitas usando JavaScript e a biblioteca jQuery.

Não vamos utilizar React, AngularJS, VueJS ou semelhante para as view para que essa série seja útil para todos e não somente para quem possui conhecimentos mais específicos dessas bibliotecas e frameworks.

Nosso RestServer de exemplo vai consistir em um cadastro de usuário com um sistema de login, e você poderá utilizar facilmente os conhecimentos adquiridos aqui para criar outros módulos para sua aplicação, uma vez que o conceito é basicamente o mesmo.

Construindo o banco de dados

Utilize a instrução SQL a seguir para criar a tabela usuarios no banco de dados que utilizaremos para exemplo. Chame o banco de dados de unici_restserver para seguir o padrão que vamos utilizar nos próximos artigos.

CREATE TABLE `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(200) NOT NULL,
`email` varchar(100) NOT NULL,
`senha` varchar(100) NOT NULL,
`biografia` mediumtext,
`avatar` varchar(200) DEFAULT NULL,
`status` int(11) NOT NULL DEFAULT '0' COMMENT '0 - Inativo\n1 - Ativo',
`criado_em` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Download do CodeIgniter e do código do RestServer

Após a criação do banco de dados, crie um novo projeto em CodeIgniter (use o Composer para ser mais rápido) e faça o download do último release disponibilizado pelo Chris, copiando os arquivos para os respectivos diretórios após terminar o download e a criação do projeto.

Comando para criação do projeto via terminal

composer create-project bcit-ci/codeigniter unici_restserver --prefer-dist

Criando os diretórios e arquivos de base

Vamos precisar de um diretório chamado api que deverá ser criado dentro de application/controllers e de um arquivo para o controller de usuários e o model, além do já conhecido arquivo .htaccess.

O controller de usuários deverá ser criado dentro de application/controllers/api e se chamar Usuarios.php. O model de usuários deverá ser criado dentro de application/modelse se chamar Usuarios_model.php. O .htaccess será criado na raiz da aplicação.

Veja a seguir o código-fonte inicial desses dois arquivos:

Usuarios.php

<?php defined('BASEPATH') OR exit('No direct script access allowed'); require APPPATH . '/libraries/REST_Controller.php'; class Usuarios extends REST_Controller { function __construct() { parent::__construct(); $this->load->model('Usuarios_model','UsuariosMDL');
    }
}

Usuarios_model.php

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Usuarios_model extends CI_Model {

}

.htaccess

O arquivo .htaccess é o responsável por ativar o uso das URLs Amigáveis, além de outras funcionalidades.

Crie esse arquivo na raiz da aplicação.

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|public|images|robots\.txt|css)
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

Aplicando as configurações iniciais

Algumas configurações básicas são necessárias para o início da construção do RestServer, então abra o arquivo application/config/autoload.php e altere os valores das seguintes chaves para ativar o carregamento automático de alguns recursos:

$autoload['libraries'] = array('database','form_validation','upload');

$autoload['helper'] = array('url');

Na sequência, abra o arquivo application/config/database.php e atualize-o com as informações de conexão do seu banco de dados.

$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
    'dsn' => '',
    'hostname' => 'seu_host',
    'username' => 'seu_usuario',
    'password' => 'sua_senha',
    'database' => 'unici_restserver',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

Pra finalizar, abra o arquivo application/config/config.php e altere a configuração de base_url conforme o código abaixo, para que o servidor possa verificar se há a disponibilidade de uso do HTTPS, detectar automaticamente o host e então montar a URL base da aplicação.

Obs.: Se você está utilizando o acesso com http://localhost ao invés de host virtual, não utilize o código a seguir, simplesmente passe para base_url a string correspondente à url do seu localhost, que deverá ser algo como http://localhost/unici_restserver.

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? "https://" : "http://";

$script_name = str_replace(basename($_SERVER['SCRIPT_NAME']), "", $_SERVER['SCRIPT_NAME']);

$config['base_url'] = $protocol . $_SERVER['HTTP_HOST'] . $script_name;

Definindo as rotas do RestServer

Agora que as configurações essenciais e os arquivos base foram criados, chegamos a um ponto muito importante na construção de um RestServer, que é a definição das URLs de acesso.

O princípio fundamental de uma aplicação REST é a separação da API em recursos lógicos, sendo esses recursos manipulados através de requisições HTTP, usando os métodos GET, POST, PUT, PATCH e DELETE.

Para essa série vamos utilizar apenas a manipulação de registros da tabela usuarios, então teremos as seguintes URLs para o nosso RestServer:

  • GET /usuarios – retorna todos os usuarios cadastrados
  • GET /usuarios/1 – retorna somente os dados do usuario cujo ID for 1
  • POST /usuarios – cria um novo registro de usuário
  • PUT /usuarios/1 – atualiza os dados do usuário cujo ID for 1
  • DELETE /usuarios/1 – apaga o registro do usuário cujo ID for 1

Sabendo quais são as URLs, agora é hora de criar as rotas. Então abra o arquivo application/config/routes.php e crie as rotas conforme o código a seguir:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = TRUE;

$route["api/usuarios"]["get"] = "api/Usuarios";
$route["api/usuarios/(:num)"]["get"] = "api/Usuarios/id/$1";
$route["api/usuarios"]["post"] = "api/Usuarios";
$route["api/usuarios/(:num)"]["put"] = "api/Usuarios/id/$1";
$route["api/usuarios/(:num)"]["delete"] = "api/Usuarios/id/$1";

Para testar e ver se realmente o roteamento está funcionando vamos voltar ao arquivo Usuarios.php dentro de application/controllers/api e criar um método chamada index_get que irá responder pela url /api/usuarios para um verbo HTTP GET.

public function index_get()
{
    $this->response(array("mensagem" => "O roteamento está funcionando corretamente."), REST_Controller::HTTP_OK);
}

Se acessar http://localhost/unici_restserver/api/usuarios o retorno será uma string exibida na tela:

{"mensagem":"O roteamento est\u00e1 funcionando corretamente."}

Se você acessar a mesma URL utilizando algum addon ou cliente Rest, verá o retorno de outra maneira.

Veja no print abaixo um exemplo da visualização do retorno utilizando o RESTClient do Firefox:

RESTClient Firefox

No próximo tutorial da série vamos implementar os recursos para os métodos GET e POST e criar as telas para começarmos a cadastrar e listar os usuários.

Até o próximo artigo!