Como escrever uma API REST em PHP em 30 minutos
Criar sua própria API REST é uma das habilidades essenciais do desenvolvedor backend moderno. Muitos iniciantes pensam que para isso são necessários frameworks pesados como Laravel ou Symfony. Na verdade, uma API REST básica em PHP puro pode ser escrita em literalmente meia hora. Neste artigo, vamos analisar o processo passo a passo de criação de um serviço RESTful que pode ser usado imediatamente em projetos reais — desde aplicativos móveis até sites de página única.
Não usaremos bibliotecas de terceiros. Todo o código será escrito em PHP vanilla. Você aprenderá a processar requisições HTTP, trabalhar com JSON, organizar roteamento e retornar os status HTTP corretos. Vamos lá!
1. Estrutura do projeto e preparação
Antes de escrever o código, vamos criar uma estrutura simples de arquivos. Para nossa API, precisaremos de apenas alguns arquivos:
index.php— ponto de entrada que processará todas as requisições;.htaccess— para redirecionar todas as requisições para o index.php (se estiver usando Apache);config.php— arquivo com configurações de conexão ao banco de dados (opcional).
Crie uma pasta para o projeto, por exemplo, my-rest-api, e coloque esses arquivos nela.
Configuração do .htaccess
Para que todas as requisições cheguem ao nosso script principal, crie o arquivo .htaccess na raiz do projeto:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [QSA,L]Este código redireciona todas as requisições que não levam a arquivos ou pastas reais para o index.php. O parâmetro QSA preserva a query string.
2. Roteamento e processamento de requisições
Agora vamos escrever o arquivo principal — index.php. Ele receberá a requisição, determinará o método HTTP (GET, POST, PUT, DELETE) e o caminho, e então chamará o manipulador adequado.
Roteamento básico
Vamos começar com um exemplo simples. Criaremos um array de rotas e uma função para processá-las:
<?phpheader('Content-Type: application/json');header('Access-Control-Allow-Origin: *');header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');header('Access-Control-Allow-Headers: Content-Type');
$method = $_SERVER['REQUEST_METHOD'];$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// Remove a barra no final$path = rtrim($path, '/');
// Roteamento simplesswitch (true) { case $path === '/api/users' && $method === 'GET': getUsers(); break; case $path === '/api/users' && $method === 'POST': createUser(); break; case preg_match('/^\\/api\\/users\\/(\\d+)$/', $path, $matches) && $method === 'GET': getUser($matches[1]); break; default: http_response_code(404); echo json_encode(['error' => 'Route not found']); break;}
function getUsers() { // Placeholder echo json_encode(['users' => ['Alice', 'Bob', 'Charlie']]);}
function getUser($id) { echo json_encode(['user' => ['id' => $id, 'name' => 'User ' . $id]]);}
function createUser() { $input = json_decode(file_get_contents('php://input'), true); echo json_encode(['message' => 'User created', 'data' => $input]);}?>Observe alguns pontos importantes:
- Definimos o cabeçalho
Content-Type: application/json— todas as respostas serão em JSON. - Os cabeçalhos CORS permitem requisições de qualquer domínio (para desenvolvimento).
- O corpo da requisição POST/PUT é lido através de
php://input.
3. Trabalhando com banco de dados
Uma API real raramente trabalha com placeholders. Vamos adicionar a conexão com MySQL via PDO. Crie o arquivo config.php:
<?phpdefine('DB_HOST', 'localhost');define(