Vamos a ver el modo de crear una API con php.
Conceptos básicos
En nuestro tercer capítulo vamos a ver cómo crear una REST API desde php y MYSQL para un contenido específico.
En nuestro primer capítulo vimos cómo usar la REST API de WordPress para disponer de nuestro contenido en un app de móvil por ejemplo.
Y en nuestro segundo capítulo al que hacemos mención a las APIs, y en el vimos como a obtener información externa por medio de una API.
Aclarado esto vamos a comenzar:
- Usaremos PHP y MySql para conectarse a nuestra API de manera simple.
- Para ello veremos como conectar a una base de datos
- A continuación haremos las consultas CRUD crear, leer, actualizar, y eliminar
- Vamos a usar RapidAPI o Sampleapis para avanzar en este ejemplo.
Nuestra base de datos de ejemplo
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; 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'); ALTER TABLE `items` ADD PRIMARY KEY (`id`); ALTER TABLE `items` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
nuestro código lo insertáremos en nuestra base de datos con phpmyadmin
Conectamos con la base de datos
<?php class Database{ private $host = 'localhost'; private $user = 'root'; private $password = ""; private $database = "DB_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; } } } ?>
nuestro fichero se llamará: connect.php
Cómo leer los datos
<?php header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); include_once 'connect.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 se encontró ningún artículo.") ); }
Que hemos realizado en este código:
- hemos puesto en la cabecera la etiqueta Content-Type: con la asignación JSON
- añadido después una simple conexión a la base de datos
- y realizamos la consulta que finalmente codificamos en formato json
nuestro fichero se llamará: read.php
Cómo crear nuevo contenido en nuestra base de datos
<?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 'connect.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" => "El artículo fue creado.")); } else{ http_response_code(503); echo json_encode(array("message" => "No se puede crear el elemento.")); } }else{ http_response_code(400); echo json_encode(array("message" => "No se puede crear el elemento. Los datos están incompletos.")); } ?>
Que hemos realizado en este código:
- hemos puesto en la cabecera la etiqueta Content-Type: con la asignación JSON
- añadido después la conexión a la base de datos
- y realizamos la consulta que finalmente decodificamos el formato json
nuestro fichero se llamará: create.php
Cómo editar el contenido
<?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" => "Actualizado corectamente.")); }else{ http_response_code(503); echo json_encode(array("message" => "No se ha podido actualizar.")); } } else { http_response_code(400); echo json_encode(array("message" => "La actualización está incompleta.")); } ?>
Que hemos realizado en este código:
- hemos puesto en la cabecera la etiqueta Content-Type: con la asignación JSON
- añadido después la conexión a la base de datos
- y realizamos la consulta que finalmente decodificamos el formato json
nuestro fichero se llamará: update.php
Cómo eliminar el contenido
<?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" => "Eliminado.")); } else { http_response_code(503); echo json_encode(array("message" => "No se ha podido eliminar")); } } else { http_response_code(400); echo json_encode(array("message" => "No se ha podido eliminar completamente")); } ?>
Que hemos realizado en este código:
- hemos puesto en la cabecera la etiqueta Content-Type: con la asignación JSON
- añadido después la conexión a la base de datos
- y realizamos la consulta que finalmente decodificamos el formato json
nuestro fichero se llamará: delete.php
Pero todo lo visto hasta el momento no funciona si no le añadimos las funciones CRUD que hacen posible que los datos se muestren o actualicen.
Class Items
<?php class Database{ private $host = 'localhost'; private $user = 'root'; private $password = ""; private $database = "baulphp_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; } } } //// AÑADIMOS LAS FUNCIONES CRUD class Items{ private $itemsTable = "items"; public $id; public $name; public $description; public $price; public $category_id; public $created; public $modified; private $conn; public function __construct($db){ $this->conn = $db; } 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; } 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; } 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; } 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; } } ?>
Hemos terminado con este último tutorial de APIs que espero hay estado a la altura y sea de utilidad en tus proyectos.