¿Cómo crear una REST API usando PHP? — Parte 1 (Setup)
A diario escuchamos hablar mal de PHP y de su fealdad, ¿Cuál es el problema realmente?, ¿Malas practicas de los desarrolladores o efectivamente el lenguaje si es feo?
Déjame decirte que a pesar de todo eso, hay mucha demanda por PHP allá fuera, muchas vacantes y todavía muchos proyectos en producción que necesitan personas con algo de conocimiento del lenguaje para arreglar pequeños bugs. ¿Aún vale la pena aprenderlo?. Si, han salido muchas librerías o frameworks que facilitan el trabajo o ponen una capa encima para no interactúar de forma tan cruda con el y solo dedicarnos a lo importante. A muchos les encanta trabajar con PHP así que si tu tienes el interés de ver que cosas podemos hacer, quédate y vamos a crear una REST API con MySQL.
Este post es una traducción de un blog de www.codeofaninja.com, pero de forma mas resumida y entendible ❤.
Las herramientas
Antes de empezar el tutorial en sí, necesitamos ver algunas herramientas las cuales son:
- Editor de código favorito (VSCode ❤, Sublime Text, Atom)
- PHP, nuestro querido lenguaje de programación a usar. (Recomiendo versión 7.0 en adelante. https://www.php.net/downloads.php)
- MySQL, nuestro Sistema gestor de Base de Datos. (Recomiendo versión 7.0 u 8.0. https://dev.mysql.com/downloads/mysql/)
- Apache Web Server, nuestro servidor local. (https://httpd.apache.org/download.cgi)
- XAMPP o WAMPP, el cual ya trae todos esos servicios integrados y una interfaz gráfica para la BD. (https://www.apachefriends.org/es/download.html)
- Conocimiento básico en el paradigma de la programación orientada a objetos.
- Postman, un genial software para testear las peticiones de nuestra API. (https://www.getpostman.com/downloads/)
Teniendo todo instalado al 100%, comencemos con la primera parte. Recomiendo usar Xampp porque en ese me basare para el tutorial.
Conceptos básicos
Estamos hablando de crear una REST API, ¿pero que es eso?. Primero veamos que es una API.
API: es una capa por medio de la cual tu tecnología o app puede interactuar con otras. Supón que acabas de desarrollar un algoritmo de detección de rostros, si quieres que alguien mas lo use no le mandaras el código. Puedes crear una API y a través de ella ofrecer una conexión a tu servicio por medio del cual obtendrán lo que quieren.
REST: es cualquier interfaz entre sistemas que use HTTP para obtener datos o generar operaciones sobre esos datos en todos los formatos posibles, como XML y JSON. Simplemente es la arquitectura por medio de la cual nos basaremos para el envío de datos desde nuestra API.
En nuestro caso, no vamos a desarrollar un algoritmo super complejo. Solo haré una API que nos de información especifica de la BD para su tratamiento.
Ahora, para comenzar creamos una carpeta en el escritorio llamada “apiPHP” y creamos los directorios correspondientes de la siguiente manera:
Si están usando Xampp o Wampp asegúrense de esta carpeta crearla dentro de htdocs o www. La cual es la raíz de nuestro localhost. En nuestra BD tendremos dos tablas llamadas category y products. Los cuales son para una tienda online y sus categorías. En config, ira todo el setup de nuestra API, en database el script de nuestra BD, en shared tendremos utilidades de la API y en objects las rutas de cada tabla (hablaremos de eso adelante).
La base de datos
De acuerdo a lo que dijimos, tendremos una base de datos llamada “apiDB”, esa la pueden crear desde consola si tienen MySQL o si instalaron Xampp pueden ir al phpMyAdmin y desde en la interfaz gráfica crear la BD.
De modo que al crear nuestra base de datos nos queda:
¿Ya la crearon?
Ahora ya con nuestra BD, dentro de ella haremos dos tablas. La primera es “categories” la cual tendrá las categorías de los productos. El script es el siguiente:
CREATE
TABLE
IF NOT
EXISTS `categories` (
`id` int(11) NOT
NULL
AUTO_INCREMENT,
`name` varchar(256) NOT
NULL,
`description` text NOT
NULL,
`created` datetime NOT
NULL,
`modified` timestamp
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP,
PRIMARY
KEY
(`id`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8 AUTO_INCREMENT=19;
Dentro de phpMyAdmin, en nuestra BD buscamos la opcion SQL y pegamos nuestro script:
Ahora, insertaremos valores de prueba en nuestra tabla “categories”, para eso de igual manera en la parte de SQL pegamos el siguiente código:
INSERT
INTO
`categories` (`id`, `name`, `description`, `created`, `modified`) VALUES
(1, 'Fashion', 'Category for anything related to fashion.', '2014-06-01 00:35:07', '2014-05-30 17:34:33'),
(2, 'Electronics', 'Gadgets, drones and more.', '2014-06-01 00:35:07', '2014-05-30 17:34:33'),
(3, 'Motors', 'Motor sports and more', '2014-06-01 00:35:07', '2014-05-30 17:34:54'),
(5, 'Movies', 'Movie products.', '0000-00-00 00:00:00', '2016-01-08 13:27:26'),
(6, 'Books', 'Kindle books, audio books and more.', '0000-00-00 00:00:00', '2016-01-08 13:27:47'),
(13, 'Sports', 'Drop into new winter gear.', '2016-01-09 02:24:24', '2016-01-09 01:24:24');
Y corremos el script. Ahora ya tenemos una tabla con datos dentro.
Vamos por la siguiente tabla “products”, el script es el siguiente:
CREATE
TABLE
IF NOT
EXISTS `products` (
`id` int(11) NOT
NULL
AUTO_INCREMENT,
`name` varchar(32) NOT
NULL,
`description` text NOT
NULL,
`price` decimal(10,0) NOT
NULL,
`category_id` int(11) NOT
NULL,
`created` datetime NOT
NULL,
`modified` timestamp
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP,
PRIMARY
KEY
(`id`)
) ENGINE=InnoDB DEFAULT
CHARSET=latin1 AUTO_INCREMENT=65;
Ya que la crearon, agregaremos registros con el siguiente script:
INSERT
INTO
`products` (`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:12:26'),
(2, 'Google Nexus 4', 'The most awesome phone of 2013!', '299', 2, '2014-06-01 01:12:26', '2014-05-31 17:12:26'),
(3, 'Samsung Galaxy S4', 'How about no?', '600', 3, '2014-06-01 01:12:26', '2014-05-31 17:12:26'),
(6, 'Bench Shirt', 'The best shirt!', '29', 1, '2014-06-01 01:12:26', '2014-05-31 02:12:21'),
(7, 'Lenovo Laptop', 'My business partner.', '399', 2, '2014-06-01 01:13:45', '2014-05-31 02:13:39'),
(8, 'Samsung Galaxy Tab 10.1', 'Good tablet.', '259', 2, '2014-06-01 01:14:13', '2014-05-31 02:14:08'),
(9, 'Spalding Watch', 'My sports watch.', '199', 1, '2014-06-01 01:18:36', '2014-05-31 02:18:31'),
(10, 'Sony Smart Watch', 'The coolest smart watch!', '300', 2, '2014-06-06 17:10:01', '2014-06-05 18:09:51'),
(11, 'Huawei Y300', 'For testing purposes.', '100', 2, '2014-06-06 17:11:04', '2014-06-05 18:10:54'),
(12, 'Abercrombie Lake Arnold Shirt', 'Perfect as gift!', '60', 1, '2014-06-06 17:12:21', '2014-06-05 18:12:11'),
(13, 'Abercrombie Allen Brook Shirt', 'Cool red shirt!', '70', 1, '2014-06-06 17:12:59', '2014-06-05 18:12:49'),
(26, 'Another product', 'Awesome product!', '555', 2, '2014-11-22 19:07:34', '2014-11-21 20:07:34'),
(28, 'Wallet', 'You can absolutely use this one!', '799', 6, '2014-12-04 21:12:03', '2014-12-03 22:12:03'),
(31, 'Amanda Waller Shirt', 'New awesome shirt!', '333', 1, '2014-12-13 00:52:54', '2014-12-12 01:52:54'),
(42, 'Nike Shoes for Men', 'Nike Shoes', '12999', 3, '2015-12-12 06:47:08', '2015-12-12 05:47:08'),
(48, 'Bristol Shoes', 'Awesome shoes.', '999', 5, '2016-01-08 06:36:37', '2016-01-08 05:36:37'),
(60, 'Rolex Watch', 'Luxury watch.', '25000', 1, '2016-01-11 15:46:02', '2016-01-11 14:46:02');
Ahora que ya tenemos nuestra BD con dos tablas “products y categories”, podemos pasar al backend de nuestra API. Eso lo veremos en la parte 2. Espero que hasta el momento vaya todo de lujo!.
Posteado con ❤ por Jimmy Vasquez.