Introducción: por qué una API REST en PHP es rápida y sencilla
\n\nREST (Transferencia de Estado Representacional) es un estilo arquitectónico que se ha convertido en el estándar para la creación de servicios web. Muchos desarrolladores principiantes temen abordar la implementación de una API, considerándola una tarea compleja. En realidad, se puede escribir una API REST completa en PHP en solo 30 minutos si se sigue la estructura correcta.
\n\nEn esta guía, crearemos una API simple pero funcional para gestionar una lista de tareas (To-Do List). Aprenderá a manejar métodos HTTP (GET, POST, PUT, DELETE), trabajar con JSON y construir el enrutamiento. Todos los ejemplos de código están listos para ejecutarse.
\n\nQué obtendrá después de leer:
\n- \n
- Una API REST funcional en PHP puro sin frameworks \n
- Comprensión de los principios de la arquitectura RESTful \n
- Una estructura lista para escalar el proyecto \n
Paso 1: Configuración de la estructura del proyecto y la base de datos
\n\nPara empezar, crearemos una estructura de carpetas simple. Solo necesitaremos un archivo PHP para el enrutamiento (index.php) y un archivo con la configuración de la base de datos (config.php).
Estructura del proyecto
\nrest-api-todo/\n│\n├── index.php (enrutador principal)\n├── config.php (conexión a la BD)\n└── .htaccess (configuración de URL amigables)\n\nCreación de la base de datos MySQL
\nEjecute esta consulta SQL en phpMyAdmin o a través de la consola:
\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('Estudiar PHP'), \n('Escribir API REST'), \n('Publicar artículo');\n\nArchivo 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' => 'Error de conexión a la BD: ' . $e->getMessage()]);\n exit;\n}\n?>\n\nPaso 2: Creación de un punto de entrada único (enrutador)
\n\nEn el archivo index.php implementaremos el enrutamiento. Este procesará la URL y redirigirá las solicitudes a las funciones correspondientes.
Archivo 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// Determinamos el ID de la tarea, si se proporciona\n$id = isset($request[0]) && is_numeric($request[0]) ? (int)$request[0] : null;\n\n// Procesamiento de 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' => 'No se especificó el ID de la tarea']);\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' => 'No se especificó el ID de la tarea']);\n }\n break;\n \n default:\n http_response_code(405);\n echo json_encode(['error' => 'Método no soportado']);\n}\n\n// --- Implementación de funciones ---\n\nfunction getTasks($pdo) {\n $stmt = $pdo->query("SELECT * FROM tasks ORDER BY created_a