Como escrever uma REST API em PHP em 30 minutos
REST API (Representational State Transfer) é um estilo arquitetônico para interação de componentes de uma aplicação distribuída em rede. No desenvolvimento web moderno, a REST API é o padrão para criar o backend de aplicativos móveis, SPAs (Single Page Application) e microsserviços. Neste artigo, mostraremos como escrever uma REST API simples, mas totalmente funcional, em PHP em apenas 30 minutos.
Criaremos uma API para gerenciar uma lista de tarefas (Todo List) com suporte a operações CRUD (Create, Read, Update, Delete). Você aprenderá como organizar o roteamento, processar requisições JSON e conectar um banco de dados MySQL.
Preparação do ambiente
Para trabalhar, você precisará de:
- Servidor web Apache ou Nginx com suporte a PHP 7.4+
- MySQL ou MariaDB
- Editor de código (VS Code, PhpStorm)
- Postman ou curl para testar a API
Crie a estrutura do projeto:
todo-api/├── index.php # Ponto de entrada (roteador)├── config.php # Configurações de conexão com o banco de dados├── api/│ └── tasks.php # Lógica de manipulação das tarefas└── .htaccess # Configurações de reescrita de URLPasso 1: Configuração do .htaccess e ponto de entrada
Crie o arquivo .htaccess para redirecionar todas as requisições para o index.php:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php?url=$1 [QSA,L]Agora, vamos criar o index.php — nosso roteador principal:
<?phpheader("Content-Type: application/json; charset=UTF-8");header("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");header("Access-Control-Allow-Headers: Content-Type, Authorization");
// Processamento de requisições preflightif ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit();}
require_once 'config.php';require_once 'api/tasks.php';
$url = isset($_GET['url']) ? rtrim($_GET['url'], '/') : '';$urlParts = explode('/', $url);$resource = $urlParts[0] ?? '';$id = $urlParts[1] ?? null;
switch ($resource) { case 'tasks': $tasks = new Tasks(); echo $tasks->handleRequest($_SERVER['REQUEST_METHOD'], $id); break; default: http_response_code(404); echo json_encode(["message" => "Resource not found"]); break;}?>Passo 2: Conexão com o banco de dados
Crie o config.php com as configurações de conexão:
<?phpclass Database { private $host = "localhost"; private $db_name = "todo_api"; private $username = "root"; private $password = ""; public $conn;
public function getConnection() { $this->conn = null; try { $this->conn = new PDO( "mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password ); $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { http_response_code(500); echo json_encode(["message" => "Database connection error"]); exit(); } return $this->conn; }}?>Crie a tabela no MySQL:
CREATE DATABASE todo_api;USE todo_api;
CREATE TABLE tasks ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT, status ENUM('pending', 'completed') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);Passo 3: Implementação das operações CRUD
Crie o arquivo api/tasks.php com a lógica principal:
```