Cómo escribir una API REST en PHP en 30 minutos
Crear tu propia API REST es una de las habilidades clave del desarrollador backend moderno. Muchos principiantes piensan que para esto se necesitan frameworks pesados como Laravel o Symfony. En realidad, se puede escribir una API REST básica en PHP puro literalmente en media hora. En este artículo, analizaremos el proceso paso a paso para crear un servicio RESTful que se pueda usar inmediatamente en proyectos reales, desde aplicaciones móviles hasta sitios de una sola página.
No usaremos bibliotecas de terceros. Todo el código estará escrito en PHP vainilla. Aprenderás a manejar solicitudes HTTP, trabajar con JSON, organizar el enrutamiento y devolver los códigos de estado HTTP correctos. ¡Vamos allá!
1. Estructura del proyecto y preparación
Antes de escribir código, creemos una estructura de archivos simple. Para nuestra API solo necesitaremos unos pocos archivos:
index.php— punto de entrada que manejará todas las solicitudes;.htaccess— para redirigir todas las solicitudes a index.php (si usas Apache);config.php— archivo con la configuración de conexión a la base de datos (opcional).
Crea una carpeta para el proyecto, por ejemplo, my-rest-api, y coloca allí estos archivos.
Configuración de .htaccess
Para que todas las solicitudes lleguen a nuestro script principal, crea un archivo .htaccess en la raíz del proyecto:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [QSA,L]Este código redirige todas las solicitudes que no apuntan a archivos o carpetas reales a index.php. El parámetro QSA conserva la query string.
2. Enrutamiento y manejo de solicitudes
Ahora escribamos el archivo principal — index.php. Este recibirá la solicitud, determinará el método HTTP (GET, POST, PUT, DELETE) y la ruta, y luego llamará al manejador correspondiente.
Enrutamiento básico
Comencemos con un ejemplo simple. Crearemos un array de rutas y una función para manejarlas:
<?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);
// Quitamos la barra al final$path = rtrim($path, '/');
// Enrutamiento simpleswitch (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]);}?>Ten en cuenta varios puntos importantes:
- Establecemos el encabezado
Content-Type: application/json— todas las respuestas estarán en JSON. - Los encabezados CORS permiten solicitudes desde cualquier dominio (para desarrollo).
- El cuerpo de las solicitudes POST/PUT se lee a través de
php://input.
3. Trabajo con la base de datos
Una API real rara vez trabaja con placeholders. Agreguemos una conexión a MySQL usando PDO. Crea el archivo config.php:
<?phpdefine('DB_HOST', 'localhost');define(