En este tutorial vamos a aprender a crear nuestro primer endpoint de una API hecho con PHP.
¿Qué es un Endpoint?
En primer lugar, cuando hablamos de APIs, un Endpoint es una URL a través de la cual nos podemos comunicar con el servidor. Es decir, es la URL a la que los clientes accederán para acceder a la información del servidor, añadir información, modificarla o borrarla. El Endpoint, por tanto, es parte del servidor, mientras que la aplicación que interactúe con éste será generalmente parte del cliente.
Creamos nuestra base de datos
El objetivo del Endpoint es servir información al cliente. Por tanto, tendremos que tener la información almacenada en alguna parte: esto es, una base de datos.
Puedes elegir alguna base de datos que tengas creada o usar alguna de esta página. Este tutorial está hecho concretamente con la base de datos de anime, aunque es muy fácil de adaptar a cualquier otra base de datos SQL.
Algo muy importante aquí, es que si estás usando XAMPP y la aplicación phpmyadmin, tengas cuidado de la codificación que elijas a la hora de crear la base de datos. Es imprescindible que sea utf8-general-ci.
Una vez creada nuestra base de datos, tenemos que crear un fichero para configurar la conexión con la base de datos, que llamaremos conexion.php. No es obligatorio crear este fichero, pero en caso de no hacerlo tendremos que configurar la conexión cada vez que vayamos a usar la base de datos, algo poco eficiente.
conexion.php
<?php
$_servidor = "localhost";
$_usuario = "usuario";
$_contrasena = "contrasena";
$_base_de_datos = "animes_bd";
try {
$_conexion = new PDO("mysql:host=$_servidor;dbname=$_base_de_datos",
$_usuario,$_contrasena);
$_conexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Conexión fallida: " . $e -> getMessage());
}
?>
En este caso estamos usando la librería PDO de PHP para hacer la conexión con la base de datos, puesto que es la más sencilla a la hora de tratar con APIs. Ten en cuenta que tendrás que cambiar tu usuario, contraseña y nombre de la base de datos a los que hayas elegido tú.
Creamos el Endpoint
Cuando creemos un Endpoint, lo mejor para ser organizados es crear un fichero diferente por cada recurso del servidor con el que queramos interactuar. La base de datos de animes tiene dos tablas: animes y estudios. Por tanto, lo mejor será crear dos ficheros separados: api_animes.php y api_estudios.php.
Empezaremos por el Endpoint de los estudios, que al tener la tabla solo dos columnas será un poco más sencillo y evitaremos cometer errores.
api_estudios.php
<?php
error_reporting( E_ALL );
ini_set( "display_errors", 1 );
header("Content-type: application/json");
include("conexion.php");
$metodo = $_SERVER["REQUEST_METHOD"];
$entrada = json_decode(file_get_contents('php://input'), true);
switch($metodo) {
case "GET":
manejarGet($_conexion);
break;
case "POST":
manejarPost($_conexion, $entrada);
break;
case "PUT":
manejarPut($_conexion, $entrada);
break;
case "DELETE":
manejarDelete($_conexion, $entrada);
break;
default:
echo json_encode(["mensaje" => "Petición no válida"]);
}
function manejarGet($_conexion) {
$sql = "SELECT * FROM estudios";
$stmt = $_conexion -> prepare($sql);
$stmt -> execute();
$resultado = $stmt -> fetchAll(PDO::FETCH_ASSOC);
echo json_encode($resultado);
}
function manejarPost($_conexion, $entrada) {
$sql = "INSERT INTO estudios (nombre_estudio, ciudad, anno_fundacion)
VALUES (:nombre_estudio, :ciudad, :anno_fundacion)";
$stmt = $_conexion -> prepare($sql);
$stmt -> execute([
"nombre_estudio" => $entrada["nombre_estudio"],
"ciudad" => $entrada["ciudad"],
"anno_fundacion" => $entrada["anno_fundacion"]
]);
if($stmt) {
echo json_encode(["mensaje" => "el estudio se ha creado"]);
} else {
echo json_encode(["mensaje" => "error al crear el estudio"]);
}
}
function manejarPut($_conexion, $entrada) {
$sql = "UPDATE estudios SET
ciudad = :ciudad,
anno_fundacion = :anno_fundacion
WHERE nombre_estudio = :nombre_estudio";
$stmt = $_conexion -> prepare($sql);
$stmt -> execute([
"ciudad" => $entrada["ciudad"],
"anno_fundacion" => $entrada["anno_fundacion"],
"nombre_estudio" => $entrada["nombre_estudio"]
]);
if($stmt) {
echo json_encode(["mensaje" => "el estudio se ha modificado"]);
} else {
echo json_encode(["mensaje" => "error al modificar el estudio"]);
}
}
function manejarDelete($_conexion, $entrada) {
$sql = "DELETE FROM estudios WHERE nombre_estudio = :nombre_estudio";
$stmt = $_conexion -> prepare($sql);
$stmt -> execute([
"nombre_estudio" => $entrada["nombre_estudio"]
]);
if($stmt) {
echo json_encode(["mensaje" => "el estudio se ha borrado"]);
} else {
echo json_encode(["mensaje" => "error al borrar el estudio"]);
}
}
?>
Vamos a desgranar paso a paso el código anterior. Las dos primeras líneas simplemente son para que se muestren por pantalla los posibles errores en el código en caso de que los tengamos desactivados en el fichero php.ini.
La siguiente línea nos indica que, cuando hagamos una petición a este fichero, la información que se devuelva será en formato JSON.
header("Content-type: application/json");
Después de esto, incluimos el fichero conexion.php para poder interactuar con la base de datos.
Por último, antes de terminar de configurar nuestro endpoint, necesitaremos un par de variables que nos serán imprescindibles.
$metodo = $_SERVER["REQUEST_METHOD"];
La variable $metodo almacenará el método HTTP con el que se ha accedido a la API. Es decir, si un usuario entra en nuestra API mediante el método GET, se almacenará «GET» en la variable. Esto será imprescindible para decidir luego qué hacer con las peticiones.
$entrada = json_decode(file_get_contents('php://input'), true);
La variable $entrada almacenará los parámetros que haya mandado el usuario. Por ejemplo, si el usuario realiza un POST con la intención de insertar un elemento en la base de datos, tendrá que enviar además los valores que quiere insertar. Si desea por ejemplo insertar un estudio llamado «Kyoto Animation», cuya ciudad es «Kyoto» y fundado en el año «1981», tendrá que mandar todos estos valores al endpoint de la API.
Probar la API
Para probar la API lo haremos mediante la aplicación Postman, que puedes descargar desde aquí. ¿Es obligatorio usar Postman? Sí y no. Podemos usar nuestro navegador para probar los endpoints que trabajan con el método GET, pero para el resto necesitaremos sí o sí alguna herramienta especializada como Postman para poder mandar peticiones HTTP de tipo POST, PUT o DELETE, entre otras.
