¿Te gustaría aprender Consultor PHP Full Stack?
Tenemos los cursos que necesitas. ¡Haz clic aquí!
¿Cómo crear un RESTful web service utilizando PHP y MySQL para consultar y guardar la información? Para que puedas probar este código debes tener instalado PHP y MySQL, si aún no lo tienes puedes instalarlo en tu computadora.
Para el ejemplo vamos a asumir que tenemos un blog y necesitamos un servicio RESTful para acceder a los artículos y editarlos, entonces nuestro servicio va a realizar estas operaciones:
- Listar todos los posts (artículos de un blog)
- Mostrar un post
- Agregar un post
- Eliminar un post
- Actualizar uno o más campos de un post
Preparar la base de datos
Vamos a utilizar una tabla llamada blog (de MySql) con estos campos:
Lo más importante aquí, es que el campo id debe estar marcado para auto incremento y debe ser la llave primaria, puedes usar este SQL, para generala en tu computadora, en mi caso la base de datos se llama blog:
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
`status` enum('draft','published') COLLATE utf8_spanish_ci NOT NULL DEFAULT 'draft',
`content` text COLLATE utf8_spanish_ci NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
Código de PHP para el web service RESTful
Ahora vamos a crear 3 archivos de PHP
- config.php: En este archivo se encuentra la configuración para la base de datos
- utils.php: Funciones que hacen más fácil interactuar con la base de datos
- post.php: El código propio del web service RESTful
Este es el archivo de configuración, debes asegurarte de que tiene todos los parámetros correctos para que pueda conectarse a tu base de datos.
<?php
$db = [
'host' => 'localhost',
'username' => 'root',
'password' => '',
'db' => 'blog' //Cambiar al nombre de tu base de datos
];
?>
Ahora el archivo de utilidades:
<?php
//Abrir conexion a la base de datos
function connect($db)
{
try {
$conn = new PDO("mysql:host={$db['host']};dbname={$db['db']};charset=utf8", $db['username'], $db['password']);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch (PDOException $exception) {
exit($exception->getMessage());
}
}
//Obtener parametros para updates
function getParams($input)
{
$filterParams = [];
foreach($input as $param => $value)
{
$filterParams[] = "$param=:$param";
}
return implode(", ", $filterParams);
}
//Asociar todos los parametros a un sql
function bindAllValues($statement, $params)
{
foreach($params as $param => $value)
{
$statement->bindValue(':'.$param, $value);
}
return $statement;
}
?>
Finalmente, este es el archivo que implementa el servicio RESTful
<?php
include "config.php";
include "utils.php";
$dbConn = connect($db);
/*
listar todos los posts o solo uno
*/
if ($_SERVER['REQUEST_METHOD'] == 'GET')
{
if (isset($_GET['id']))
{
//Mostrar un post
$sql = $dbConn->prepare("SELECT * FROM posts where id=:id");
$sql->bindValue(':id', $_GET['id']);
$sql->execute();
header("HTTP/1.1 200 OK");
echo json_encode( $sql->fetch(PDO::FETCH_ASSOC) );
exit();
}
else {
//Mostrar lista de post
$sql = $dbConn->prepare("SELECT * FROM posts");
$sql->execute();
$sql->setFetchMode(PDO::FETCH_ASSOC);
header("HTTP/1.1 200 OK");
echo json_encode( $sql->fetchAll() );
exit();
}
}
// Crear un nuevo post
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$input = $_POST;
$sql = "INSERT INTO posts
(title, status, content, user_id)
VALUES
(:title, :status, :content, :user_id)";
$statement = $dbConn->prepare($sql);
bindAllValues($statement, $input);
$statement->execute();
$postId = $dbConn->lastInsertId();
if($postId)
{
$input['id'] = $postId;
header("HTTP/1.1 200 OK");
echo json_encode($input);
exit();
}
}
//Borrar
if ($_SERVER['REQUEST_METHOD'] == 'DELETE')
{
$id = $_GET['id'];
$statement = $dbConn->prepare("DELETE FROM posts where id=:id");
$statement->bindValue(':id', $id);
$statement->execute();
header("HTTP/1.1 200 OK");
exit();
}
//Actualizar
if ($_SERVER['REQUEST_METHOD'] == 'PUT')
{
$input = $_GET;
$postId = $input['id'];
$fields = getParams($input);
$sql = "
UPDATE posts
SET $fields
WHERE id='$postId'
";
$statement = $dbConn->prepare($sql);
bindAllValues($statement, $input);
$statement->execute();
header("HTTP/1.1 200 OK");
exit();
}
//En caso de que ninguna de las opciones anteriores se haya ejecutado
header("HTTP/1.1 400 Bad Request");
?>
Ahora voy a explicar un poco el último archivo, como ya sabes en RESTful la acción a ejecutar depende mucho del método HTTP que utilizas, entonces utilizo la variable $_SERVER['REQUEST_METHOD']
, para determinar si se está haciendo una petición GET, POST, DELETE o PUT.
Con la sentencia header("HTTP/1.1 200 OK")
, puedo enviar códigos de respuesta, para informar si el servicio se ejecutó con éxito o con algún error.
Con la sentencia json_encode
de php, se transforma la salida de echo
en un formato JSON, lo cual es necesario en los servicios RESTful.
Como probar el servicio RESTful
Los servicios RESTful no se pueden probar en un navegador, porque no hay forma de enviar peticiones PUT o DELETE, entonces podemos usar un programa especial como postman.
Mejoras a este programa.
El código te muestra como implementar un web service RESTFul usando PHP, y para mantener el código sencillo omití algunas validaciones que no debería de faltar en un ambiente de producción, por ejemplo:
Cuando realizas el update, no deberías de permitir actualizar todos los campos, por ejemplo, campos de fecha de creación, usuario que modifica, etc.
En caso de que se solicite un post por ID y el ID no exista debería de retornar un código 404 Not found. Lo mismo aplica para editar o eliminar.
También hace falta una forma de autenticarse antes de permitir acceso a los métodos de eliminar, actualizar o insertar información.
Te esperamos en los próximos artículos en donde hablaremos más acerca de estos temas que hoy en día son de importancia e interés en el mundo de la tecnología.
¿Te gustaría aprender Consultor PHP Full Stack?
Tenemos los cursos que necesitas. ¡Haz clic aquí!