Cómo escribir una API REST en PHP en 30 minutos
REST API (Representational State Transfer) es un estilo arquitectónico para la interacción de componentes de una aplicación distribuida en la red. En el desarrollo web moderno, REST API es el estándar para crear el backend de aplicaciones móviles, SPA (Single Page Application) y microservicios. En este artículo, mostraremos cómo escribir una API REST simple pero completamente funcional en PHP en solo 30 minutos.
Crearemos una API para gestionar una lista de tareas (Todo List) con soporte para operaciones CRUD (Create, Read, Update, Delete). Aprenderá a organizar el enrutamiento, procesar solicitudes JSON y conectar una base de datos MySQL.
Preparación del entorno
Para trabajar necesitará:
- Servidor web Apache o Nginx con soporte para PHP 7.4+
- MySQL o MariaDB
- Editor de código (VS Code, PhpStorm)
- Postman o curl para probar la API
Cree la estructura del proyecto:
todo-api/├── index.php # Punto de entrada (enrutador)├── config.php # Configuración de conexión a la BD├── api/│ └── tasks.php # Lógica de trabajo con tareas└── .htaccess # Configuración de reescritura de URLPaso 1: Configuración de .htaccess y punto de entrada
Cree el archivo .htaccess para redirigir todas las solicitudes a index.php:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php?url=$1 [QSA,L]Ahora crearemos index.php — nuestro enrutador 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");
// Manejo de solicitudes 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;}?>Paso 2: Conexión a la base de datos
Cree config.php con la configuración de conexión:
<?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; }}?>Cree la tabla en 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);Paso 3: Implementación de operaciones CRUD
Cree el archivo api/tasks.php con la lógica principal: