Crear una REST API y darle uso

Crear una REST API y darle uso

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.