Cómo crear una API de RESTful con PHP desde cero, para acceso a base de datos MySQL o MariaDB. Estos métodos permitirán acceder a nuestra base de datos desde cualquier dispositivo o aplicación y realizar tareas de inserción de registros, eliminación de registros, modificación de registros y selección de registros. Se incluye la descarga del código fuente completo en PHP de esta API RESTful de ejemplo.

Definición de API de REST o API de RESTful

Se trata de una interfaz de programación de aplicaciones (API o web API) que se ajusta a los límites de la arquitectura REST (estilo de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web) y permite la interacción con los servicios web de RESTful (servicio web que implementa la arquitectura REST).

Sus principios son:

  • Arquitectura cliente-servidor: separación de responsabilidades. Cuanto menos conoce el servidor sobre el cliente más desacoplada está su interacción y más fácil resulta el cambio de componentes. Por definición, REST es una arquitectura diseñada para funcionar con sistemas distribuidos centralizados.
  • Ausencia de estado: el estado se guarda y mantiene en el cliente y no en el servidor. Las solicitudes deben proveer toda la información necesaria para poder realizarse en un servidor que no mantiene estados, por lo que no guarda contexto entre llamadas para un mismo cliente.
  • Habilitación y uso de la caché: todas las solicitudes deben declarar si son o no cacheables. Una forma estándar de hacerlo es con los encabezados cache-control de HTTP. De esta forma, se pueden enviar respuestas cacheadas desde cualquier punto de la red sin necesidad de que la petición llegue al servidor. Pese a que en el caso de una API dinámica esto puede parecer no tener sentido, puede ahorrar costes en casos de datos inmutables, como definiciones.
  • Sistema por capas: tiene relación con la separación de responsabilidades anteriormente mencionada, y establece que un cliente debe conocer únicamente la capa a la que le está hablando. Es decir, no debe tener en cuenta aspectos concretos, como particularidades de la base de datos usada; o abstracciones como cachés, proxies o balanceadores de carga implicados. Si se necesita seguridad, esta se debe añadir encima de los servicios Web, permitiendo que la lógica y seguridad permanezcan separadas.
  • Interfaz uniforme:
    • Identificación de recursos en las peticiones: las solicitudes identifican a recursos individuales. Sin embargo, REST hace hincapié en que que los recursos están conceptualmente separados de las representaciones que son devueltas por el servidor (HTML, XML, JSON, etc.). El tipo de formato se puede especificar en las cabeceras HTTP y, mediante negociación de contenido, servidor y cliente pueden ponerse de acuerdo en la respuesta que mandará el primero y que espera el segundo.
    • Manipulación de recursos a través de representaciones: la especificación de REST intenta economizar peticiones en todo lo que sea posible. Por ello, cuando un cliente posee la representación de un recurso, incluyendo cualquier metadato adjunto, tiene suficiente información para modificar o eliminar el estado del recurso. Es decir, mediante las herramientas que REST promueve (uso de API auto-documentada, descriptiva, verbos HTTP, etc.), el cliente puede saber predecir el resultado esperado de hacer cualquier operación sobre un recurso recibido primeramente con un GET.
    • Mensajes auto-descriptivos: la idea de un mensaje auto-descriptivo es contener toda la información que el cliente necesita para entenderlo. Por lo tanto, no debería existir información adicional en una documentación separada o en otro mensaje.
    • Hipermedia como motor del estado de la aplicación: una vez se ha accedido a la URI inicial de la aplicación, un cliente REST debería ser capaz de usar los enlaces proveídos dinámicamente por parte del servidor para descubrir todos los recursos disponibles que necesita. Según continúa el proceso, el servidor responde con texto que incluye enlaces a otros recursos que están actualmente disponibles. Esto elimina la necesidad de que el cliente tenga información escrita en el código (hard-codeada) con respecto a la estructura o referencias dinámicas a la aplicación.

Seguridad del API RESTful

En este caso, se trata de una prueba de concepto y no se aplicarán medidas de seguridad en el desarrollo del API RESTful. Únicamente de desarrollará una API básica y desde cero, con los procedimientos habituales de inserción, eliminación, selección y modificación de registros.

Para un uso en producción del API RESTful es muy conveniente aplicar determinadas medidas de seguridad:

  • Las peticiones HTTP al servidor de Apache/Nginx deben ir siempre por HTTPS, con la información cifrada.
  • Se deben usar validación de usuario y contraseña, pasando siempre la contraseña cifrada.
  • Se deben usar tokens de conexión por sesión, variando con cada usuario y cada sesión.

Base de datos MySQL o MariaDB

El primer paso para el uso de un API RESTful es disponer de una base de datos, a la cual accederemos mediante el API. O bien ya tenemos una base de datos accesible o bien la creamos. En este tutorial usaremos una base de datos MariaDB versión 10, externa (en servidor externo), con la siguiente tabla de datos:

El procedimiento que explicaremos a continuación, más optimizado, podría servir casi para cualquier motor de base de datos. Este sería el objetivo de una buena API RESTful, abstraerse del motor de base de datos. Pero no es objeto de este artículo, donde crearemos, desde cero, un API completo para insertar, eliminar, modificar y seleccionar registros de una tabla.

Servidor con Apache o Nginx para las peticiones PHP

Necesitaremos disponer de un servidor Apache o Nginx para recibir y procesar las peticiones PHP. En dicho servidor web será donde coloquemos los ficheros PHP para el API RESTful. Será el encargado de compilar estos ficheros y realizar el acceso a la base de datos, entre otras cosas.

En el siguiente artículo explicamos cómo montar un servidor web Apache con acceso a MySQL/MariaDB:

Fichero PHP de conexión a la base de datos BaseDatos.php

En primer lugar, crearemos el fichero PHP de conexión a base de datos. Los ficheros PHP del API RESTful los colocaremos en el servidor web Apache/Nginx anteriormente mencionado. Los situaremos en una carpeta de la raíz del servidor web. Por ejemplo, para nuestro caso, que usamos un servidor Apache en Linux, los colocaremos en:

/var/www/facturas

En esta carpeta, crearemos el primer fichero PHP, para la conexión con la base de datos MySQL/MariaDB. Lo llamaremos BaseDatos.php y tendrá este contenido:

Como es lógico, cambiaremos los valores de conexión por los nuestros propios (servidor, usuario, contraseña y base de datos).

Este fichero tendría que optimizarse para permitir la conexión a otros motores de base de datos Oracle, PostgreSQL, SQL Server, etc.

Fichero PHP de métodos para el API RESTful Metodos.php con insertar

Crearemos un nuevo fichero PHP en la misma carpeta, llamado Metodos.php. Este fichero contendrá todos los métodos de manipulación de datos en la base de datos: insertar registro, modificar registro, eliminar registro y seleccionar (consultar/devolver) registros.

Empezaremos mostrando el contenido base de este fichero, con el método «insertar» (más adelante añadiremos el resto de métodos a este mismo fichero):

Fichero PHP para insertar registro en base de datos con API RESTful

Crearemos otro fichero nuevo en la misma carpeta, en este caso el fichero insertar.php. Contendrá el procedimiento para insertar el registro en la base de datos (consulta SQL de inserción). Tendrá el siguiente contenido:

Como podemos comprobar, el fichero anterior instancia dos clases:

  • BaseDatos: la clase contenida en el fichero BaseDatos.php, la que conecta con el servidor de base de datos MySQL/MariaDB.
  • Metodos: la clase contenida en el fichero Metodos.php, el que contiene los métodos que se usarán para el API RESTful: insertar, eliminar, modificar y listar.

Probar uso de API RESTful con Postman

Una vez creados estos tres ficheros iniciales: BaseDatos.php, Metodos.php y insertar.php, es el momento de hacer una primera prueba de nuestra API RESTful. Para ello, podemos usar el comando curl o bien algún sitio web online que permita ejecución de URL con API RESTful, como Postman (esta será la que usemos).

Para probar, podemos usar alguna web online que permita ejecutar API RESTful, como por ejemplo postman. Es posible que tentamos que registrarnos para poder usarla. Una vez registrados y dentro de nuestro My Workspace, pulsaremos en «New», eligiendo «HTTP»:

Probar uso de API RESTful con Postman

Introduciremos los siguientes datos:

  • POST: elegiremos este método en el desplegable.
  • URL: introduciremos la URL completa de ejecución del API, en nuestro caso https://ajpdsoft.com/facturas/insertar.php
  • Elegiremos «Raw» para la introducción de datos, e introduciremos los siguientes datos:

Pulsaremos en «Send» para enviar la petición API RESTful. Si todo es correcto, se insertará un registro en la base de datos MySQL/MariaDB y devolverá el resultado: message: Registro insertado correctamente.

Si listamos los registros de la base de datos para la tabla «facturas», podremos comprobar que se ha insertado el cliente «Cliente 4 ProyectoA»:

Probar uso de API RESTful con Postman

Probar API RESTful con comando curl

Si queremos probar el método insertar() con el comando curl, desde la línea de comandos (en Windows), ejecutaremos:

Probar API RESTful con comando curl

La ventaja de usar el comando curl es que podremos realizar todas las pruebas de nuestra API desde nuestro equipo, sin tener que acceder a un sitio web. Además, el comando curl es muy versátil e incluye infinidad de opciones para obtener estados, errores, resultados, tipos de consultas HTTP, etc.

Añadir método para modificar registros en fichero Metodos.php

Añadiremos el siguiente método, que será para modificar un registro existente, en el fichero Metodos.php. Este método necesitará que se le pase por parámetro el código del registro a modificar y los datos modificados (cliente, importe y fecha). Para ello, editaremos el fichero existente Metodos.php y, en el final, añadiremos:

Y añadiremos también, al principio del fichero Metodos.php y dentro de la clase Metodos (al final de artículo mostraremos el contenido completo del fichero Metodos.php):

Crear fichero PHP para modificar registros con API RESTful

De la misma forma, crearemos el fichero PHP para modificar un registro, que llamaremos modificar.php, con el siguiente contenido:

Para realizar la prueba, con Postman, introduciremos la URL: htts://www.ajpdsoft.com/facturas/modificar.php y los datos:

Esta API modificará el registro con código 3 de la tabla de facturas, estableciendo los nuevos datos pasados de cliente, importe y fecha.

Podremos hacer la prueba también con el comando curl, ejecutando, desde la línea de comandos:

Crear fichero PHP para modificar registros con API RESTful

Añadir método para listar registros en fichero Metodos.php

Continuamos añadiendo métodos, en este caso el de listar registros: obtener los datos de un registro a partir de su código. Añadiremos al final del fichero Metodos.php el siguiente código:

Crear fichero PHP para listar registros con API RESTful

Crearemos el fichero listar.php. Este fichero contiene el procedimiento para hacer un select en la base de datos, filtrando por código, de la tabla factura, para devolver los datos del registro filtrado. En este caso, usaremos el paso de parámetros estándar por URL (GET):

Para probar el método listar(), podemos ejecutar el siguiente comando curl (devolverá los datos del registro con código = 3):

Crear fichero PHP para listar registros con API RESTful

Añadir método para eliminar registros en fichero Metodos.php

Seguimos añadiendo métodos, en este caso, el método para eliminar un registro de la tabla facturas, filtrando por código. Añadiremos el siguiente código al final del fichero Metodos.php:

Crear fichero PHP para eliminar registros con API RESTful

El último fichero que crearemos, será el de eliminar registro, filtrando por código. Crearemos el fichero eliminar.php con el siguiente contenido:

Para probar el método eliminar() podremos ejecutar el siguiente comando curl (eliminará el registro con código = 3):

Descarga del código fuente completo del ejemplo de API RESTful en PHP

A continuación, mostramos un enlace a la descarga gratuita del código fuente completo empleado en este ejemplo de API RESTful en PHP: