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.
El Estudio de Manuel Piquer, en aplicación de la normativa vigente en materia de protección de datos de carácter personal, informa que los datos personales que se recogen a través de los formularios de su sitio web, se incluyen en los ficheros automatizados específicos de usuarios de los servicios de la agencia.