Application Programming Interface tem função de intermediar comunicação universal entre diferentes sistemas, assim como do banco de dados com o próprio sistema (interno ou externo), utilizando protocolo de comunicação HTTP (XML/JSON), requisitados via URL específica, independente da tecnologia do sistema que irá consumí-la (acessá-la).
Representational State Transfer. Técnica que consiste em princípios que, quando seguidos, permitem a criação de projetos (web services) com interfaces/arquitetura bem definidas (padrão REST), utilizando novos métodos/verbos REST HTTP:
Nativamente, o HTTP é Stateless (Não guarda estado). Com o uso de REST, permitirá que as requisições HTTP armazenem dados (estados). Os Web services que estão em conformidade com o estilo arquitetural REST são denominados Web services RESTful. Um sistema é considerado RESTful quando segue corretamente o padrão REST.
Requisição HTTP do dispositivo ao servidor web. Incluem dados de pares chave/valor na URI (query string).
Ex: /api/produtos?order=desc&limit=5
Versão da API: /api/v1/produtos
Resposta HTTP do servidor web ao dispositivo, sob sua requisição.
Exemplo prático
Aplicação Front-end envia requisição HTTP com métodos REST para Back-end, que, de acordo com a URL, realizará determinadas rotinas e gerará um JSON de resposta com os resultados da requisição. Essa requisição, geralmente, será reenviada ao Front-end, que o 'consumirá' em um layout interativo ao usuário.
Exemplo consultar dados de cliente: Usuário clica em Consultar Cliente, que enviará URL requisitando dados do cliente ao Back-end. Conforme parâmetros na URI requisitada (ID do usuário, URL via método GET) (Request), dinâmica e denominada endpoint, com isso, o Back-end, por meio da API REST (Métodos e padrões de código) com Laravel, consultará BD e criará JSON com resultado dos dados do cliente solicitado e o enviará de volta ao Front-end (Response), que lerá o JSON (Consumir API REST) com React, mostrando os dados do cliente em interface gráfica agradável para o usuário.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateArtigosTable extends Migration {
public function up() {
Schema::create('artigos', function (Blueprint $table) {
$table->id();
$table->string('titulo');
$table->text('conteudo');
$table->timestamps();
});
}
public function down() {
Schema::dropIfExists('artigos');
}
}
<?php
namespace App\Http\Controllers;
use App\Models\Artigo as Artigo;
use App\Http\Resources\Artigo as ArtigoResource;
use Illuminate\Http\Request;
class ArtigoController extends Controller {
public function index() {
$artigos = Artigo::paginate(15);
return ArtigoResource::collection($artigos);
}
public function show($id) {
$artigo = Artigo::findOrFail( $id );
return new ArtigoResource($artigo);
}
public function store(Request $request) {
$artigo = new Artigo;
$artigo->titulo = $request->input('titulo');
$artigo->conteudo = $request->input('conteudo');
if($artigo->save()) {
return new ArtigoResource($artigo);
}
}
public function update(Request $request) {
$artigo = Artigo::findOrFail($request->id);
$artigo->titulo = $request->input('titulo');
$artigo->conteudo = $request->input('conteudo');
if(artigo->save()) {
return new ArtigoResource($artigo);
}
}
public function destroy($id) {
$artigo = Artigo::findOrFail($id);
if($artigo->delete()) {
return new ArtigoResource($artigo);
}
}
}
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ArtigoController;
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::get('artigos',[ArtigoController::class,'index']); //Listar artigos
Route::get('artigo/{id}',[ArtigoController::class,'show']); //Ver artigo
Route::post('artigo',[ArtigoController::class,'store']); //Criar artigo
Route::put('artigo/{id}',[ArtigoController::class,'update']); //Editar artigo
Route::delete('artigo/{id}',[ArtigoController::class,'destroy']); //Excluir artigo
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Artigo extends JsonResource {
public function toArray($request){
//return parent::toArray($request);
return [
'id' => $this->id,
'titulo' => $this->titulo,
'conteudo' => $this->conteudo
];
}
/* public function with( $request ){
return [
'version' => '1.0.0',
'author_url' => url('https://ubsocial.github.io')
];
} */
}
{
"titulo": "Primeiro artigo pelo Postman",
"conteudo": "Descrição desse artigo de número um."
}
{
"titulo": "Segundo artigo pelo Postman",
"conteudo": "Descrição desse artigo de número dois."
}
{
"titulo": "Terceiro artigo pelo Postman",
"conteudo": "Descrição desse artigo de número três."
}
{
"titulo": "ATUALIZANDO Primeiro artigo pelo Postman",
"conteudo": "Descrição desse artigo de número um sendo ATUALIZADO."
}
Elaborado por Mateus Schwede
ubsocial.github.io