Lenguaje PHP

Crear una API RESTful con PHP y MySQL

7 pasos para crear un API RESTful

Crear una API RESTful con PHP y MySQL. En este articulo crearemos una API RESTfull simple usando el lenguaje PHP y como base de datos MySQL respetando los parámetros en su proceso.

¿Qué es una API REST?

REST (Representational State Transfer) es una arquitectura de sistema que define el conjunto de métodos para acceder a los servicios web. Sin embargo, el objetivo principal de REST API es crear un sistema que pueda ser utilizado por diferentes aplicaciones.
  • La API de REST se crea con operaciones CRUD (Create, Read, Update, Delete).
  • API REST se consume realizando una solicitud HTTP (GET, POST, PUT o DELETE) desde el lado del cliente.
  • Esta API se implementa de forma que devuelva la respuesta en JSON o XML o en cualquier otro formato.

Pasos para crear un API RESTful

  • Crear la tabla de base de datos MySQL
  • La conexión con la base de datos
  • Creación de elementos
  • Lectura de elementos
  • La actualización de elementos
  • Eliminar elementos existentes.
  • Implementar las URLs amigables

Crear una API RESTful con PHP y MySQL

Entonces, si está trabajando en una aplicación para trabajar en diferentes dispositivos como escritorio, dispositivos móviles, etc., puede crear una API REST con las operaciones requeridas para acceder a diferentes aplicaciones, como la aplicación web y la aplicación móvil. En este tutorial aprenderá cómo crear una API RESTful simple con PHP y MySQL. Implementaremos la API REST con operaciones CRUD para crear elementos, leer elementos, actualizar elementos y eliminar elementos. Cubriremos este tutorial paso a paso con un ejemplo en vivo para crear una API RESTFul para realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) y consumir API REST con solicitud HTTP (GET, POST, PUT o DELETE) para jugar con los datos de los elementos. Así que comencemos la codificación. Tendremos la siguiente estructura de archivos para nuestro ejemplo de API REST.

Primer paso: Crear tabla de base de datos MySQL

Crearemos la tablas con sus respectivas columnas.
CREATE TABLE `items` (
`id` int(11) NOT NULL,
`name` varchar(256) NOT NULL,
`description` text NOT NULL,
`price` int(255) NOT NULL,
`category_id` int(11) NOT NULL,
`created` datetime NOT NULL,
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
También insertaremos unos registros para realizar operaciones.
INSERT INTO `items` (`id`, `name`, `description`, `price`, `category_id`, `created`, `modified`) VALUES
(1, 'LG P880 4X HD', 'My first awesome phone!', 336, 3, '2014-06-01 01:12:26', '2014-05-31 17:42:26'),
(2, 'Google Nexus 4', 'The most awesome phone of 2013!', 299, 2, '2014-06-01 01:12:26', '2014-05-31 17:42:26'),
(3, 'Samsung Galaxy S4', 'How about no?', 600, 3, '2014-06-01 01:12:26', '2014-05-31 17:42:26'),
(6, 'Bench Shirt', 'The best shirt!', 29, 1, '2014-06-01 01:12:26', '2014-05-31 02:42:21'),
(7, 'Lenovo Laptop', 'My business partner.', 399, 2, '2014-06-01 01:13:45', '2014-05-31 02:43:39'),
(8, 'Samsung Galaxy Tab 10.1', 'Good tablet.', 259, 2, '2014-06-01 01:14:13', '2014-05-31 02:44:08'),
(9, 'Spalding Watch', 'My sports watch.', 199, 1, '2014-06-01 01:18:36', '2014-05-31 02:48:31'),
(10, 'Sony Smart Watch', 'The coolest smart watch!', 300, 2, '2014-06-06 17:10:01', '2014-06-05 18:39:51'),
(11, 'Huawei Y300', 'For testing purposes.', 100, 2, '2014-06-06 17:11:04', '2014-06-05 18:40:54'),
(12, 'Abercrombie Lake Arnold Shirt', 'Perfect as gift!', 60, 1, '2014-06-06 17:12:21', '2014-06-05 18:42:11'),
(13, 'Abercrombie Allen Brook Shirt', 'Cool red shirt!', 70, 1, '2014-06-06 17:12:59', '2014-06-05 18:42:49'),
(26, 'Another product', 'Awesome product!', 555, 2, '2014-11-22 19:07:34', '2014-11-21 21:37:34'),
(28, 'Wallet', 'You can absolutely use this one!', 799, 6, '2014-12-04 21:12:03', '2014-12-03 23:42:03'),
(31, 'Amanda Waller Shirt', 'New awesome shirt!', 333, 1, '2014-12-13 00:52:54', '2014-12-12 03:22:54'),
(42, 'Nike Shoes for Men', 'Nike Shoes', 12999, 3, '2015-12-12 06:47:08', '2015-12-12 07:17:08'),
(48, 'Bristol Shoes', 'Awesome shoes.', 999, 5, '2016-01-08 06:36:37', '2016-01-08 07:06:37'),
(60, 'Rolex Watch', 'Luxury watch.', 25000, 1, '2016-01-11 15:46:02', '2016-01-11 16:16:02');

Segundo paso: Crear conexión de base de datos

En la configuración del directorio, crearemos una clase Database.php para establecer la conexión a la base de datos MySQL.
<?php
class Database{

private $host = 'localhost';
private $user = 'root';
private $password = "";
private $database = "php_demo"; 

public function getConnection(){ 
$conn = new mysqli($this->host, $this->user, $this->password, $this->database);
if($conn->connect_error){
die("Error failed to connect to MySQL: " . $conn->connect_error);
} else {
return $conn;
}
}
}
?>

Tercer paso: Implementar la creación de elementos

En los elementos de directorio, crearemos un archivo crear.php e implementar elementos crear funcionalidad para insertar un nuevo registro en la base de datos. La API aceptará valores HTTP POST para crear un registro. Crearemos el objeto de la clase Items.php y llamaremos al método create() para guardar el registro.
creacion de registros api restful php
creacion de registros api restful php
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

include_once '.. / config/Database.php';
include_once '.. / class/Items.php';

$database = new Database();
$db = $database->getConnection();

$items = new Items($db);

$data = json_decode(file_get_contents("php://input"));

if(!empty($data->name) && !empty($data->description) &&
!empty($data->price) && !empty($data->category_id) &&
!empty($data->created)){

$items->name = $data->name;
$items->description = $data->description;
$items->price = $data->price;
$items->category_id = $data->category_id; 
$items->created = date('Y-m-d H:i:s'); 

if($items->create()){ 
http_response_code(201); 
echo json_encode(array("message" => "Item was created."));
} else{ 
http_response_code(503); 
echo json_encode(array("message" => "Unable to create item."));
}
}else{ 
http_response_code(400); 
echo json_encode(array("message" => "Unable to create item. Data is incomplete."));
}
?>
En la clase Items.php, implementaremos el método create() para insertar valores POST en la tabla de la base de datos.
<?php
function create(){

$stmt = $this->conn->prepare("
INSERT INTO ".$this->itemsTable."(`name`, `description`, `price`, `category_id`, `created`)
VALUES(?,?,?,?,?)");

$this->name = htmlspecialchars(strip_tags($this->name));
$this->description = htmlspecialchars(strip_tags($this->description));
$this->price = htmlspecialchars(strip_tags($this->price));
$this->category_id = htmlspecialchars(strip_tags($this->category_id));
$this->created = htmlspecialchars(strip_tags($this->created));


$stmt->bind_param("ssiis", $this->name, $this->description, $this->price, $this->category_id, $this->created);

if($stmt->execute()){
return true;
}

return false; 
}
?>
Probaremos el ejemplo Crear URL desde nuestra API REST usando la siguiente URL con postman App.
https://demo.baulphp.com/rest-api/items/create
PUBLICAREMOS los siguientes valores de datos JSON para crear un nuevo registro de elemento.
{
"name": "Usha Sewing Machine",
"description": "its best machine",
"price":"90000",
"category_id":"6",
"created": "2019-11-09 04:30:00"
}

Cuarto paso: Implementar la lectura de elementos

En los elementos de directorio, crearemos la lectura de archivos PHP.php e implementaremos la funcionalidad de lectura de elementos. Manejaremos la funcionalidad de lectura de elementos con el método HTTP GET para obtener todos los elementos o elementos específicos. Crearemos el objeto de la clase Items.php y el método de llamada read() y devolveremos los datos de respuesta en formato JSON.
API RESTful con PHP
API RESTful con PHP
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

include_once '.. / config/Database.php';
include_once '.. / class/Items.php';

$database = new Database();
$db = $database->getConnection();

$items = new Items($db);

$items->id = (isset($_GET['id']) && $_GET['id']) ? $_GET['id'] : '0';

$result = $items->read();

if($result->num_rows > 0){ 
$itemRecords=array();
$itemRecords["items"]=array(); 
while ($item = $result->fetch_assoc()) { 
extract($item); 
$itemDetails=array(
"id" => $id,
"name" => $name,
"description" => $description,
"price" => $price,
"category_id" => $category_id, 
"created" => $created,
"modified" => $modified 
); 
array_push($itemRecords["items"], $itemDetails);
} 
http_response_code(200); 
echo json_encode($itemRecords);
}else{ 
http_response_code(404); 
echo json_encode(
array("message" => "No item found.")
);
} 
?>
En la clase Items.php, implementaremos el método read() para leer elementos de la base de datos.
<?php
function read(){ 
if($this->id) {
$stmt = $this->conn->prepare("SELECT * FROM ".$this->itemsTable." WHERE id = ?");
$stmt->bind_param("i", $this->id); 
} else {
$stmt = $this->conn->prepare("SELECT * FROM ".$this->itemsTable); 
} 
$stmt->execute(); 
$result = $stmt->get_result(); 
return $result; 
}
?>
Probaremos el ejemplo de URL de lectura de nuestra API REST utilizando la siguiente URL con la aplicación POSTMAN.
https://demo.baulphp.com/rest-api/items/read
La URL de lectura anterior devolverá todo el registro de elementos en formato de datos JSON. Necesitamos pasar una identificación de artículo específica para obtener ese registro de elemento.

Quinto paso: Implementar la actualización de elementos

En los elementos de directorio, crearemos la actualización del archivo PHP.php e implementaremos la funcionalidad de actualización de elementos con el método HTTP PUT. Crearemos el objeto de clase Items.php y llamaremos al método update() para actualizar los detalles de los elementos.
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

include_once '.. / config/Database.php';
include_once '.. / class/Items.php';

$database = new Database();
$db = $database->getConnection();

$items = new Items($db);

$data = json_decode(file_get_contents("php://input"));

if(!empty($data->id) && !empty($data->name) && 
!empty($data->description) && !empty($data->price) && 
!empty($data->category_id)){ 

$items->id = $data->id; 
$items->name = $data->name;
$items->description = $data->description;
$items->price = $data->price;
$items->category_id = $data->category_id; 
$items->created = date('Y-m-d H:i:s'); 


if($items->update()){ 
http_response_code(200); 
echo json_encode(array("message" => "Item was updated."));
}else{ 
http_response_code(503); 
echo json_encode(array("message" => "Unable to update items."));
}

} else {
http_response_code(400); 
echo json_encode(array("message" => "Unable to update items. Data is incomplete."));
}
?>
En la clase Items.php, implementaremos el método update() para actualizar los detalles del elemento a la tabla de base de datos.
<?php
function update(){

$stmt = $this->conn->prepare("
UPDATE ".$this->itemsTable." 
SET name= ?, description = ?, price = ?, category_id = ?, created = ?
WHERE id = ?");

$this->id = htmlspecialchars(strip_tags($this->id));
$this->name = htmlspecialchars(strip_tags($this->name));
$this->description = htmlspecialchars(strip_tags($this->description));
$this->price = htmlspecialchars(strip_tags($this->price));
$this->category_id = htmlspecialchars(strip_tags($this->category_id));
$this->created = htmlspecialchars(strip_tags($this->created));

$stmt->bind_param("ssiisi", $this->name, $this->description, $this->price, $this->category_id, $this->created, $this->id);

if($stmt->execute()){
return true;
}

return false;
}
?>
Probaremos el ejemplo de URL de actualización desde nuestra API REST utilizando la siguiente URL con la aplicación POSTMAN.
https://demo.baulphp.com/rest-api/items/update
PONDREMOS los siguientes valores de datos JSON con el registro de actualización de id de elemento existente. Aquí estamos pasando el id de elemento 61 para actualizar el registro.
{
"id": "61",
"name": "Usha Sewing Automatic Machine",
"description": "its best machine",
"price":"90000",
"category_id":"6",
"created": "2019-11-09 04:30:00"
}
Editar registro usando api restfull
Editar registro usando api restfull
Sexto paso: Implementar la eliminación de elementos En los elementos de directorio, crearemos una eliminación de archivos PHP.php para implementar la funcionalidad de eliminación de elementos. Crearemos el objeto de la clase Items.php y llamaremos al método delete() para eliminar elementos.
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

include_once '.. / config/Database.php';
include_once '.. / class/Items.php';

$database = new Database();
$db = $database->getConnection();

$items = new Items($db);

$data = json_decode(file_get_contents("php://input"));

if(!empty($data->id)) {
$items->id = $data->id;
if($items->delete()){ 
http_response_code(200); 
echo json_encode(array("message" => "Item was deleted."));
} else { 
http_response_code(503); 
echo json_encode(array("message" => "Unable to delete item."));
}
} else {
http_response_code(400); 
echo json_encode(array("message" => "Unable to delete items. Data is incomplete."));
}
?>
En la clase Items.php, implementaremos el método delete() para eliminar elementos.
<?php
function delete(){

$stmt = $this->conn->prepare("
DELETE FROM ".$this->itemsTable." 
WHERE id = ?");

$this->id = htmlspecialchars(strip_tags($this->id));

$stmt->bind_param("i", $this->id);

if($stmt->execute()){
return true;
}

return false; 
}
?>
Probaremos el ejemplo de Eliminar URL de nuestra API REST usando la siguiente URL con la aplicación POSTMAN.
https://demo.baulphp.com/rest-api/items/delete
PONDREMOS los siguientes valores de datos JSON con id de elemento para eliminar el registro de elemento. Aquí estamos pasando el id de elemento 61 para actualizar el registro.
{
"id": 61
}
Eliminar registros con api restfull
Eliminar registros con api restfull

Setimo paso: Hacer que las URL de solicitud de SEO sean amigables de la API de REST

En los elementos de directorio, crearemos un archivo HTACCESS .htaccess para hacer URL amigables para SEO usando estas instrucciones.
RewriteEngine On # Turn on the rewriting engine
RewriteRule ^read$ read.php [NC,L]
RewriteRule ^read/([0-9_-]*)$ read.php?id=$1 [NC,L]
RewriteRule ^create$ create.php [NC,L]
RewriteRule ^update$ update.php [NC,L]
RewriteRule ^delete$ delete.php [NC,L]
[wpsm_woobox id=»13234″]

Conclusión

Con esta explicación hemos implementado un simple API RESTful con PHP y MySQL que poseen la funciones de un CRUD, es decir, Crear, Leer, Actualizar, Eliminar. Además, hemos implementado el método POST y el método GET para procesar la información. Sin embargo, para el testeo hemos usado la plataforma POSTMAN. Por último, para obtener un resultado profesional hemos implementado las URLs amigables SEO que es muy beneficioso para el SEO. Sin embargo, lo hemos implementado en el fichero .HTACCESS. Espero que este articulo les ayude en sus proyectos web.

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

5 comentarios

    1. No se si sea tarde mi respuesta, pero esto «ssiisi» hace referencia al tipo de datos que se van a insertar en la tabla (string, string, integer, integer, string, integer).

      Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba