Configuración de API

Sistemas API – Ejemplo.

Se puede estructurar de manera simple utilizando el enfoque procedural o una mezcla con programación orientada a objetos.

Crear una API en PHP de forma nativa (sin Frameworks ni dependencias adicionales).

La revitalizada galería de arte está llamada a redefinir el paisaje cultural.
Con una meticulosa atención al detalle y un compromiso con la excelencia, creamos espacios que inspiran, elevan y enriquecen la vida de quienes los habitan.

Estructura del Proyecto Básico.

/blog-api
├── /db
│ └── connection.php
├── /functions
│ └── post_functions.php
├── index.php
└── .htaccess (opcional, para redirección con Apache).
db/connection.php
<?php 
function getConnection()
{
$host = "localhost";
$dbname = "blog_db";
$username = "root";
$password = "";
try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch (PDOException $e) {
echo json_encode(["error" => "Error de conexión: " . $e->getMessage()]); exit;
}
}
?>
functions/post_functions.php
<?php 
require_once __DIR__ . '/../db/connection.php';
// Obtener todas las publicaciones
function getAllPosts() {
$pdo = getConnection();
$stmt = $pdo->query("SELECT * FROM posts ORDER BY created_at DESC");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} // Obtener una publicación por ID
function getPostById($id) {
$pdo = getConnection();
$stmt = $pdo->prepare("SELECT * FROM posts WHERE id = :id");
$stmt->execute(['id' => $id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
} // Crear una nueva publicación
function createPost($data) {
$pdo = getConnection();
$stmt = $pdo->prepare("INSERT INTO posts (title, content) VALUES (:title, :content)");
return $stmt->execute(
['title' => $data['title'],
'content' => $data['content']]
);
} // Actualizar una publicación function updatePost($id, $data) {
$pdo = getConnection();
$stmt = $pdo->prepare("UPDATE posts SET title = :title, content = :content WHERE id = :id");
return $stmt->execute(['title' => $data['title'], 'content' => $data['content'], 'id' => $id]);
} // Eliminar una publicación function deletePost($id)
{
$pdo = getConnection();
$stmt = $pdo->prepare("DELETE FROM posts WHERE id = :id");
return $stmt->execute(['id' => $id]); }
?>
El archivo index.php
<?php 
header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
require_once __DIR__ . '/functions/post_functions.php'; $requestMethod = $_SERVER["REQUEST_METHOD"]; $path = explode('/', trim($_SERVER['REQUEST_URI'], '/')); $resource = $path[0] ?? null; $id = $path[1] ?? null; // Verificar el recurso solicitado if ($resource === 'posts') {
switch ($requestMethod) {
case 'GET': if ($id) {
$post = getPostById($id);
if ($post) {
echo json_encode($post);
} else
{
http_response_code(404);
echo json_encode(["message" => "Publicación no encontrada"]);
}
}
else
{
echo json_encode(getAllPosts()); }
break;
case 'POST': $data = json_decode(file_get_contents("php://input"), true);
if (createPost($data)) { http_response_code(201);
echo json_encode(["message" => "Publicación creada"]);
}
else {
http_response_code(400);
echo json_encode(["message" => "Error al crear la publicación"]);
}
break;
case 'PUT': if ($id)
{
$data = json_decode(file_get_contents("php://input"), true);
if (updatePost($id, $data))
{
echo json_encode(["message" => "Publicación actualizada"]);
}
else {
http_response_code(400);
echo json_encode(["message" => "Error al actualizar la publicación"]);
}
}
else
{
http_response_code(400);
echo json_encode(["message" => "ID requerido para actualizar"]);
}
break;
case 'DELETE': if ($id) {
if (deletePost($id)) { echo json_encode(["message" => "Publicación eliminada"]);
}
else
{ http_response_code(400);
echo json_encode(["message" => "Error al eliminar la publicación"]);
}
}
else
{
http_response_code(400);
echo json_encode(["message" => "ID requerido para eliminar"]);
}
break;
default: http_response_code(405);
echo json_encode(["message" => "Método no permitido"]);
break;
}
}
else
{
http_response_code(404);
echo json_encode(["message" => "Recurso no encontrado"]);
}
?>
La tabla posts
CREATE TABLE posts 
(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Configuración del Apache
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
Rutas
Pruebas de la API
GET /posts → Obtener todas las publicaciones.
GET /posts/{id} → Obtener una publicación por ID
POST /posts → Crear una nueva publicación (requiere JSON con title y content).
PUT /posts/{id} → Actualizar una publicación existente.
DELETE /posts/{id} → Eliminar una publicación
curl -X POST -H "Content-Type: application/json" -d '{"title": "Mi título", "content": "Mi contenido"}' http://localhost/blog-api/postscurl -X GET http://localhost/blog-api/posts
curl -X PUT -H "Content-Type: application/json" -d '{"title": "Título actualizado", "content": "Contenido actualizado"}' http://localhost/blog-api/posts/1
curl -X DELETE http://localhost/blog-api/posts/1