Desenvolvendo uma Restful API

Nos tempos modernos integração entre aplicações, sejam elas para celulares, tablets ou computadores se tornou muito requisitado. Sendo assim, as pessoas estão querendo cada vez mais criar algo em um computador e depois da mesma forma poder modificar isso por celulares e entre outros. Para facilitar essa integração entre aplicações podemos utilizar uma restful api.

Oque é uma restful api?

Básicamente o restful funciona por requisições HTTP, com aqueles velhos métodos GET, POST, PUT e DELETE. Porém ela tem a vantagem de fazer com que qualquer cliente requisitando algo seja recebido com sucesso, ou seja, não importa o modo que você está se comunicando, se ele fazer uma requisição http você conseguirá ter resultado. Vale ressaltar que é muito bem estruturado e funcional.

Desenvolvendo uma Restful API

Instalando o Slim

Para desenvolver nossa api vamos necessitar de um servidor que possa reescrever urls e php da versão 5.5 para cima.

Criando o projeto

Primeiro vamos criar o projeto dentro da pasta www ou htdocs, dependerá se está utilizando Wamp, Xampp ou outro, o importante é criar a pasta na raiz como um website qualquer, vamos navegar até essa pasta com o cmd ou terminal

Desenvolvendo uma Restful API

cd [caminho-do-projeto]

Você irá precisar agora do Composer, caso não tenha pode estar baixando aqui https://getcomposer.org/download/

Em seguida você precisará baixar o SlimFramework, com o comando

composer require slim/slim
ou
$ php composer require slim/slim

Será feito o download de uma pasta "vendor" com os arquivos necessários

Criando o htaccess
Em seguida abra um editor de texto e adicione as seguintes linhas

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

Básicamente isso faz com que o SlimFramework funcione, sem isso ele não entenderá as rotas e irá acusar que o pastas e diretórios não foram encontrados, salve o arquivo como .htaccesss e feche.

Vamos ao desenvolvimento

Chegamos na melhor parte, vamos ao desenvolvimento, ainda na raiz do seu projeto crie um arquivo "index.php" e adicione as seguintes linhas dentro da tag php

<?php
use PsrHttpMessageServerRequestInterface as Request;
use PsrHttpMessageResponseInterface as Response;
require _DIR_ . ‘/vendor/autoload.php’;

$app = new SlimApp;

$app->get(‘/restful/{name}’,’hello’);

function hello(Request $request, Response $response, array $args){
echo "Ola ".$args[‘name’];
}

$app->run(); ?>

Salve o arquivo e teste da seguinte forma, localhost/[nome-do-projeto]/restful/[seunome] na barra do navegador.

Explicando:

As duas primeiras linhas servem para conseguirmos consumir as Requests (Requisições) e Reponses (Respostas), em seguida utilizamos um require no arquivo autoload.php daquela pasta que foi adicionada anteriormente "vendor", isso é oque o SlimFramework necessita para fazer o seu trabalho. Depois instanciamos um objeto do Tipo Slim e damos o nome de $app, esse objeto será oque vamos utilizar para a maioria das coisas, a parte interessante começa no get, podemos ver que estamos utilizando uma requisição do tipo GET, o primeiro parametro é o endereço que digitamos quando fizemos o teste lembra veja que temos um "{name}" que quer dizer que iremos passar um nome depois da barra, o segundo parametro significa que iremos chamar uma função chamada hello, que no caso é a função logo abaixo que trata de imprimir na tela a mensagem "Ola" e o seu nome, repare que a função recebe como parametro request, response e args, os args são os argumentos passados na url como "{name}".

A ultima linha trata de iniciar tudo oque foi digitado.

Mas vamos a exemplos mais úteis, vamos criar um banco de dados no phpmyadmin, crie um banco de dados com o nome restful. Vamos criar duas tabelas de exemplo

CREATE TABLE categoria(
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(30)
);

CREATE TABLE cliente(
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(50),
id_categoria INT,
FOREIGN KEY (id_categoria) REFERENCES categoria(id)
);

Agora vamos ao código php lembre-se, adicione o código dentro das tags php

<?php
use PsrHttpMessageServerRequestInterface as Request;
use PsrHttpMessageResponseInterface as Response;
require _DIR_ . ‘/vendor/autoload.php’;

$app = new SlimApp;

$app->get(‘/getcategories’,’getCategories’);
$app->get(‘/addcategories/{name}’,’addCategories’);
$app->get(‘/getclients’,’getClients’);
$app->post(‘/clients’,’addCliente’);
$app->delete(‘/deleteclient’,’delClient’);
$app->put(‘/putclient’,’putCliente’);
$app->run();

function getConn(){
return new PDO(‘mysql:host=localhost;dbname=restful’, ‘root’,”, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}

function getCategories(){
$conn = getConn()->query("Select * FROM categoria");
$categories = $conn->fetchAll(PDO::FETCH_OBJ);
echo "{categorias:".json_encode($categories)."}";
}

function addCategories(Request $request, Response $response, array $args){
$sql = "INSERT INTO categoria VALUES (null, :name);";
$conn = getConn();
$stmt = $conn->prepare( $sql );
$stmt->bindParam("name",$args[‘name’]);
$stmt->execute();
}

function getClients(){
$conn = getConn()->query("Select * FROM cliente");
$categories = $conn->fetchAll(PDO::FETCH_OBJ);
echo "{categorias:".json_encode($categories)."}";
}

function addCliente(Request $request, Response $response, array $args){
$client = json_decode($request->getBody());
$sql = "INSERT INTO cliente(nome,id_categoria) values (:nome, :idCategoria)";
$conn = getConn();
$stmt = $conn->prepare($sql);
$stmt->bindParam("nome", $client->nome);
$stmt->bindParam("idCategoria", $client->idCategoria);
$stmt->execute();
$client->id = $conn->lastInsertId();
echo json_encode($client);
}

function putCliente(Request $request, Response $response, array $args){
$client = json_decode($request->getBody());
$sql = "UPDATE cliente SET nome = :nome, id_categoria = :idCategoria WHERE id = :id";
$conn = getConn();
$stmt = $conn->prepare($sql);
$stmt->bindParam("nome",$client->nome);
$stmt->bindParam("idCategoria",$client->idCategoria);
$stmt->bindParam("id",$client->id);
$stmt->execute();
echo json_encode($client);
}

function delClient(Request $request, Response $response, array $args){
$client = json_decode($request->getBody());
$sql = "DELETE FROM cliente WHERE id = :id";
$conn = getConn();
$stmt = $conn->prepare($sql);
$stmt->bindParam("id",$client->id);
$stmt->execute();
echo json_encode($client);
}

?>

Bom, vamos lá, Vou explicar as coisas novas, de resto está igual a o exemplo anterior.

Repare nas requisições, estamos usando POST,PUT e DELETE agora, vamos a função da requisição POST no caso "addCliente", essa função irá receber o corpo da requisição feita em JSON e decodificar para o PHP, estou utilizando o PDO como meio de conexão com o banco de dados. Criei uma query do tipo INSERT e chamo a conexão com o banco que está na função getConn(), em seguida utilizo meios de segurança do PDO que testa se a entrada é suspeita a SQLInjection, caso não for, executa e retorna os dados devolta por json. O método PUT e DELETE são semelhantes porém recebe o id do cliente que será alterado ou deletado. Se tiver dúvidas sobre o PDO do php pode consultar aqui http://php.net/manual/pt_BR/class.pdo.php ,os métodos get já foram demostrados no exemplo anterior, só adicionei um echo com chaves para ficar mais legivel o JSON retornado.

Como testar os métodos POST, PUT e DELETE?

Bem simples, você pode usar um programa como o Postman (https://www.getpostman.com/) ou simplesmente fazer uma requisição utilizando o PHP ou qualquer outra linguagem que faça requisições POST e PUT. Vale lembrar que o tipo de dados que estamos recebendo na API que programos é JSON, então um exemplo de um post de um cliente novo seria o seguinte.
Exemplos:

Com POST:

url para fazer o post: http://localhost/projeto/clientes

{
"nome": "Anderson",
"idCategoria": "2"
}

Com PUT:

url para fazer o post: http://localhost/projeto/putclient
{
"nome": "Anderson Henrique",
"idCategoria": "1",
"id": "1"
}

Com DELETE:

url para fazer o post: http://localhost/projeto/deleteclient
{
"id": "1"
}

No PUT eu passo o id do cliente e o nome completo que antes estava somente Anderson, pois adicionamos no POST, já no delete eu somente passo o id do Anderson e ele será excluído. É ai que entra a graça da API, pois utilizando qualquer linguagem como Android, ASP, Python. Para qualquer tipo de aplicação, você conseguirá fazer um CRUD independente da aplicação. Expero que tenham entendido, qualquer dúvida podem entrar em contato.

Source: SQL Injection


Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *