Introdução: por que REST API em PHP é rápido e simples
\n\nREST (Representational State Transfer) é um estilo arquitetural que se tornou padrão para a criação de serviços web. Muitos desenvolvedores iniciantes têm receio de implementar uma API, considerando isso uma tarefa complexa. Na verdade, escrever uma API REST completa em PHP pode ser feito em apenas 30 minutos, se você seguir a estrutura correta.
\n\nNeste guia, criaremos uma API simples, mas funcional, para gerenciar uma lista de tarefas (To-Do List). Você aprenderá a lidar com métodos HTTP (GET, POST, PUT, DELETE), trabalhar com JSON e construir o roteamento. Todos os exemplos de código estão prontos para execução.
\n\nO que você obterá após a leitura:
\n- \n
- Uma API REST funcional em PHP puro, sem frameworks \n
- Compreensão dos princípios da arquitetura RESTful \n
- Uma estrutura pronta para escalar o projeto \n
Passo 1: Configuração da estrutura do projeto e banco de dados
\n\nPara começar, criaremos uma estrutura de pastas simples. Precisaremos apenas de um arquivo PHP para roteamento (index.php) e um arquivo com as configurações do banco de dados (config.php).
Estrutura do projeto
\nrest-api-todo/\n│\n├── index.php (roteador principal)\n├── config.php (conexão com o BD)\n└── .htaccess (configuração de URL amigável)\n\nCriação do banco de dados MySQL
\nExecute esta consulta SQL no phpMyAdmin ou pelo console:
\nCREATE DATABASE todo_api;\n\nUSE todo_api;\n\nCREATE TABLE tasks (\n id INT AUTO_INCREMENT PRIMARY KEY,\n title VARCHAR(255) NOT NULL,\n completed BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nINSERT INTO tasks (title) VALUES \n('Estudar PHP'), \n('Escrever REST API'), \n('Publicar artigo');\n\nArquivo config.php
\n<?php\n// config.php\nheader('Content-Type: application/json');\nheader('Access-Control-Allow-Origin: *');\nheader('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');\nheader('Access-Control-Allow-Headers: Content-Type');\n\n$host = 'localhost';\n$dbname = 'todo_api';\n$username = 'root';\n$password = '';\n\ntry {\n $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);\n $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch(PDOException $e) {\n echo json_encode(['error' => 'Erro ao conectar ao BD: ' . $e->getMessage()]);\n exit;\n}\n?>\n\nPasso 2: Criação do ponto de entrada único (roteador)
\n\nNo arquivo index.php, implementaremos o roteamento. Ele processará a URL e redirecionará as requisições para as funções correspondentes.
Arquivo index.php (código completo)
\n<?php\nrequire_once 'config.php';\n\n$method = $_SERVER['REQUEST_METHOD'];\n$request = explode('/', trim($_SERVER['PATH_INFO'] ?? '/', '/'));\n\n// Determina o ID da tarefa, se fornecido\n$id = isset($request[0]) && is_numeric($request[0]) ? (int)$request[0] : null;\n\n// Processamento dos diferentes métodos HTTP\nswitch($method) {\n case 'GET':\n if ($id) {\n getTask($pdo, $id);\n } else {\n getTasks($pdo);\n }\n break;\n \n case 'POST':\n createTask($pdo);\n break;\n \n case 'PUT':\n if ($id) {\n updateTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => 'ID da tarefa não informado']);\n }\n break;\n \n case 'DELETE':\n if ($id) {\n deleteTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => 'ID da tarefa não informado']);\n }\n break;\n \n default:\n http_response_code(405);\n echo json_encode(['error' => 'Método não suportado']);\n}\n\n// --- Implementação das funções ---\n\nfunction getTasks($pdo) {\n $stmt = $pdo->query("SELECT * FROM tasks ORDER BY created_a