Como crear una API RestFul en Laravel (Segunda parte)

Como crear una API RestFul en Laravel (Segunda parte)

diciembre 2, 2018 Backend 0

Autenticación con Passport

Este paquete es muy usado para trabajar con la autenticación en Laravel, especialmente en una api. Lo primero que debemos hacer bajarla con el composer.

Luego, se realiza la migración de las tablas, al realizar la migración, se borran los datos de las tablas, por lo que es conveniente, volver a correr los seed para que genere los Factory.

Luego, ya migradas las tablas, se procede a instalar el Passport, sino se realiza esto, no creara los datos de la tabla oauth_clients, es indispensable para que funcione el Passport.

Buscamos el archivo del modelo del usuario llamado User, que viene por defecto en Laravel, se debe agregar lo siguiente dentro de la clase de User.

Luego, en la carpeta App buscamos otra carpeta llamada Providers y ubicamos el archivo AuthServiceProvider, en la función boot añadir la línea de Passport.

Luego buscamos la carpeta config, el archivo auth y cambiamos en donde dice driver de la api a passport.

Ahora queremos crear un usuario, y para ello, podemos usar la función que tiene Laravel para generar la autenticación de los usuarios, crea un formulario para el registro de usuarios, el inicio de sesión y la recuperación de contraseña.

Abrimos en el navegador, y nos aparece el siguiente menú, allí accederemos a register y nos registraremos para poder acceder a la api.

Ahora, abrimos el Postman, y configuraremos de la siguiente manera para que la aplicación nos dé un token de acceso. En la cabecera Headers, agregar los campos Accept y Content-Type que reciba un json.

En el body, es decir, lo que la aplicación va a recibir con nuestros datos. El client_id y client_secret, son los que Passport creo, hay que buscarlos en la tabla oauth_clients, copiarlos y pegarlos.

Enviamos la información, esta nos retornara el access_token que estamos buscando, copiamos todo el access_token.

Ahora con el access_token, debo guardarlo en un nuevo campo llamado Authorization colocarle Bearer y luego el access_token, esta dirección nos retornara los datos del usuario que pertenece ese access_token.

Crear nuevo producto

Debemos especificar que opciones debería tener acceso un usuario autenticado y que no, en la siguiente línea, establecemos que cualquier persona que no esté registrada puede ver información con respecto a la lista de productos y el detalle del producto, pero no puede actualizar, crear un nuevo producto o incluso eliminar. Esta función se crea en el controlador del Producto, es el contructor.

Para crear un nuevo producto, debemos especificar qué datos son requeridos para guardar un producto en la base de datos, para ello es adecuado crear un request, que nos indique que datos son requeridos y cuales son otras especificaciones de los campos.

Una vez creado el request para los productos, en la función authorize se debe poner true, y en rules, las especificaciones para cada dato de la tabla.

Ahora en la función store del controlador del Producto, en el parámetro que recibe, se debe colocar el ProductoRequest que creamos anteriormente, para que primero haga las validaciones necesarias, antes de guardarlas.

Al probar, el enlace para crear nuevos productos en Postman, se debe especificar en la cabecera body, todos los datos necesarios para guardar un producto, el resultado al enviarlo es el siguiente:

Actualizar un Producto

 Ubicamos la función update en el controlador de Producto y actualizamos a la siguiente información, regresamos la información en un json, con el recurso del producto, para que, al momento de actualizarlo, nos devuelva la información actualizada con la misma estructura de todos los productos, anteriormente establecida, para que no muestre toda la información al usuario.

Primero se debe especificar que campos se deben llenar, esto se logra, agregando una variable al modelo Producto llamado fillable, especificando los campos que son necesarios ser llenados, esto también se hace para evitar el llenado masivo de datos.

Una vez implementado esto, lo probamos en el Postman, especificando las siguientes cabeceras, y cambiando el body al campo que queramos cambiar en ese momento.

Borrar un producto

Para borrar un producto, ubicamos la función destroy del controlador de Producto, y cambiamos la información que allí se encuentra.

Manejo de Excepciones

Es importante hacer un manejo de excepciones, porque cuando ingresemos un id de producto que no se encuentre o simplemente escribamos mal el enlace, deberíamos tener todas esas situaciones cubiertas y que lance el mensaje de error correcto. El Laravel dispone de una clase llamada Handler, en la función render, podemos personalizar las excepciones, en este caso, cree una función llamada apiException para evitar tanto código en esta sección.

Dentro de la carpeta exceptions cree un archivo llamado ExceptionTrait y cree la función que llamamos en el handler, apiException.Alli colocamos las excepciones que el programa nos arroja al colocar un dato erróneo. Al colocar ModelNotFoundException es para lanzar un mensaje de error personalizado cuando no encontremos el producto, cuando el producto no existe, la excepción NotFoundHttpException es para lanzar un mensaje de error en caso que la dirección este errónea.

 

En la siguiente captura, podemos observar que el producto con id 51 no existe, entonces nos lanza un mensaje que nosotros habíamos personalizado, y se ve mucho mejor.

Ahora queremos agregar que usuario tiene permitido ver la información del producto. Creamos un nuevo campo en la tabla productos, llamado producto_id.

Implementamos la migración. Solo hacemos esto porque estamos en un entorno de prueba, si estuviésemos en producción, tendríamos que crear una nueva migración para agregar el nuevo campo.

En el Factory de Producto, agregamos el siguiente campo.

Ahora necesitamos crear usuarios, para poder generar productos y reseñas.

Podemos crear una nueva excepción personalizada, para indicar cuando un producto no pertenece al usuario.

Le indicaremos lo siguiente:

En el controlador del producto, agregamos una función llamada ProductUserAuth para verificar si coinciden o no.

Llamamos la función en update y destroy del controlador de Producto

Ahora al probar, veremos lo siguiente:

Cuando probamos que el usuario coincida, muestra lo siguiente:

Crear nuevas reseñas

Verificamos la ruta que es para guardar nuevas reseñas.

Creamos un request para indicar que datos son requeridos, y que atributos soporta.

Se indica los campos y reglas que tendrá cada uno.

Se prueba no ingresando ningún dato para verificar que si funciona el request.

En la función store del controlador de Resenia, se debe proceder a lo siguiente: Es muy parecido a lo que hicimos con producto.

Creamos la variable fillable para indicar que campos son llenados.

Creamos una reseña del producto con id 38

Actualizar una reseña

Se establece el metodo update de la siguiente manera:

Buscamos las rutas de PUT/PATCH que es para actualizar y DELETE que es para borrar.

Borrar una reseña

El método destroy del controlador Resenia, será el siguiente:

Esta es una api muy sencilla, donde solo se implementó lo básico, es excelente para comprender lo fácil y sencillo que puede resultar construir una api en Laravel.