No mundo do desenvolvimento web, os termos REST e RESTful são onipresentes. Embora pareçam a mesma coisa, entender a nuance entre o conceito e a prática é o que diferencia um desenvolvedor iniciante de um profissional que domina a arquitetura de sistemas.

Neste artigo, vamos desmistificar esses conceitos e construir uma API prática em PHP utilizando todos os verbos HTTP.


1. O que é REST? Link para o cabeçalho

REST (Representational State Transfer) é um estilo de arquitetura definido por Roy Fielding em 2000. Ele estabelece um conjunto de restrições que, quando seguidas, permitem a criação de sistemas web escaláveis, leves e de fácil manutenção.

As principais restrições incluem:

  • Client-Server: Separação total entre quem solicita os dados (cliente) e quem os armazena (servidor).

  • Stateless: O servidor não armazena o estado da sessão. Cada requisição deve ser autossuficiente.

  • Interface Uniforme: O uso padronizado de URIs e métodos HTTP.

2. O que é RESTful? Link para o cabeçalho

Uma API é considerada RESTful quando ela consegue aplicar, na prática, os princípios do REST. Enquanto o REST é o guia teórico, o RESTful é o sistema que ganhou vida seguindo esse guia.

Nota Importante: Uma API que usa apenas GET e POST para tudo não é RESTful. Para ser RESTful, é necessário usar os verbos corretos para cada tipo de operação.


3. Guia de Verbos HTTP (CRUD) Link para o cabeçalho

Para criar uma interface uniforme, utilizamos os métodos HTTP como “verbos” de ação:

Verbo Ação Descrição
GET Read Recupera informações de um recurso.
POST Create Cria um novo recurso.
PUT Update Substitui um recurso existente por completo.
PATCH Update Modifica apenas partes específicas de um recurso.
DELETE Delete Remove um recurso específico.
OPTIONS Metadata Informa quais métodos o servidor suporta.

4. Implementação Prática em PHP Link para o cabeçalho

Abaixo, um exemplo de um “Endpoint” de usuários que lida com todos os métodos para demonstrar uma aplicação RESTful:

<?php
/**
 * API RESTful Simples em PHP
 * Simula um CRUD de usuários
 */

header("Content-Type: application/json; charset=UTF-8");

// Captura o método e o ID (se enviado via URL como ?id=X)
$method = $_SERVER['REQUEST_METHOD'];
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;

// Mock de dados (Simulando um Banco de Dados)
$banco_dados = [
    1 => ["nome" => "Ana Silva", "email" => "ana@provedor.com"],
    2 => ["nome" => "Carlos Souza", "email" => "carlos@provedor.com"]
];

switch ($method) {
    case 'GET':
        // Se houver ID, busca um; se não, lista todos
        if ($id) {
            $resposta = $banco_dados[$id] ?? ["erro" => "Usuário não encontrado"];
        } else {
            $resposta = $banco_dados;
        }
        echo json_encode($resposta);
        break;

    case 'POST':
        // Recebe dados para criação
        $entrada = json_decode(file_get_contents('php://input'), true);
        $novo_id = count($banco_dados) + 1;
        echo json_encode([
            "status" => "Recurso Criado",
            "id" => $novo_id,
            "dados" => $entrada
        ]);
        http_response_code(201); // Created
        break;

    case 'PUT':
        // Atualização TOTAL do recurso
        $entrada = json_decode(file_get_contents('php://input'), true);
        echo json_encode([
            "status" => "Recurso $id substituído integralmente",
            "novos_dados" => $entrada
        ]);
        break;

    case 'PATCH':
        // Atualização PARCIAL (Ex: mudar apenas o e-mail)
        $entrada = json_decode(file_get_contents('php://input'), true);
        echo json_encode([
            "status" => "Campo " . array_key_first($entrada) . " do recurso $id atualizado",
            "modificacao" => $entrada
        ]);
        break;

    case 'DELETE':
        // Remoção do recurso
        echo json_encode(["status" => "Recurso $id removido com sucesso"]);
        break;

    case 'OPTIONS':
        // Essencial para o protocolo e para o navegador (CORS)
        header("Allow: GET, POST, PUT, PATCH, DELETE, OPTIONS");
        http_response_code(204); // No Content
        break;

    default:
        http_response_code(405); // Method Not Allowed
        echo json_encode(["erro" => "Método não suportado"]);
        break;
}

5. Conclusão Link para o cabeçalho

Entender a diferença entre REST e RESTful permite que você construa APIs mais limpas e integráveis. Enquanto o REST fornece o mapa, o comportamento RESTful garante que você está dirigindo pelo caminho certo, respeitando os padrões da web.

A utilização correta de verbos como PATCH e PUT evita ambiguidades no desenvolvimento e facilita a vida de quem consome sua API, seja um Front-end em React, uma aplicação Mobile ou outro serviço de backend.