Verbos en las rutas de Laravel

  • Por
  • y  
  • PHP
Explicamos cómo el HTTP Routing System de Laravel 5 permite la configuración de diversos verbos con los que especificar qué tipo de operación se desea realizar.

El sistema de rutas de Laravel es bastante sencillo de utilizar, por lo que en pocos pasos podremos crear todo tipo de rutas bastante complejas. No obstante, al ser tan potente, si quieres analizarlo en profundidad gastarás tiempo. En este artículo pretendemos hacer una primera aproximación al sistema de enrutado de solicitudes HTTP, analizando lo que son los verbos de las solicitudes. En futuras entregas analizaremos otros elementos fundamentales.

Para comenzar no está de más una primera pasada por la documentación oficial, que de un vistazo rápido te dará una idea sobre la multitud de cosas que podrás realizar y configurar. Nosotros estamos utilizando como referencia para este artículo la documentación del sistema de rutas de Laravel 5.1.

Primero queremos recordar que en el Manual de Laravel 5 ya explicamos cómo realizar una primera ruta simple y vimos cosas como la configuración de las funciones anónimas o closures para especificar el tipo de tratamiento que se debe realizar para cada ruta. Esto lo puedes encontrar en el artículo Primera prueba de Laravel con el sistema de rutas y para no repetirnos hay cosas que no volveremos a explicar.

Verbos HTTP

Ya los mencionamos, pero cabe incidir de nuevo sobre los verbos HTTP porque forman parte de las rutas Laravel. Los verbos del HTTP son algo relativo al protocolo de comunicación HTTP, usado en la web, por lo tanto no tienen que ver con Laravel específicamente.

Sirven para decir el tipo de acción que quieres realizar con un recurso (la URL), siendo posible especificar en el protocolo (la formalidad de la conexión por HTTP entre distintas máquinas) el verbo o acción que deseamos realizar.

Son 8 verbos en el protocolo: Head, Get, Post, Put, Delete, Trace, Options, Connect. Y si ya eres desarrollador web y no te suena haberlos usado nunca te diré que realmente no es así. Get es la acción que se usa en el protocolo habitualmente, cuando se consulta un recurso. Sirve para recuperar información. Post por su parte es la acción que se realiza cuando se mandan datos, de un formulario generalmente. Los otros verbos no se usan de una manera muy habitual, pero sí se han dado utilidad en el desarrollo de lo que se conoce como API REST.

Laravel ya viene preparado para implementar APIs REST, así que usa los verbos del protocolo para generar sus rutas de aplicación. De momento nos debe quedar claro que el acceso a un URI como "/test" puede tener diversos verbos a la hora de realizarse por parte de un sistema. Para Laravel el acceso a "/test" (o cualquier otro URI) usando la acción Get no es el mismo que el acceso a "/test" usando la acción Post.

En resumen, el significado de los verbos es:

  • Get: recuperar información, podemos enviar datos para indicar qué se desea recuperar, pero mediante get en principio no se debería generar nada, ningún tipo de recurso en el servidor o aplicación, porque los datos se verán en la URL y puede ser inseguro.
  • Post: enviar datos que se indicarán en la propia. Esos datos no se verán en la solicitud, puesto que viajan con la información del protocolo.
  • Put: esto sirve para enviar un recurso, subir archivos al servidor, por ejemplo. No está activo en muchas configuraciones de servidores web. Con put se supone que los datos que estamos enviando son para que se cree algún tipo de recurso en el servidor.
  • Delete: borrado de algo.
  • Trace, patch, link, unlink, options y connect… no están entre los verbos comunes de Laravel, por lo que te referimos a la Wikipedia para más información.

Registrando rutas con sus verbos

Las rutas se registran con los verbos, usando el método correspondiente de la fachada Route. Ya se ha mencionado pero lo repetimos: Todo el listado de rutas que queramos producir se debe escribir en el fichero app/Http/routes.php

Nota: Es la primera vez en este manual que usamos la terminología "fachada" que es un patrón de diseño de software orientado a objetos usada de manera intensiva en Laravel. Podrás encontrar referencias a este patrón a partir de la palabra "facade", en inglés. De momento vamos a obviar esa palabra para tratarla en detalle más adelante.

La clase Route (la fachada del sistema de rutas) tiene varios métodos estáticos con los verbos sobre los que queremos dar de alta una ruta de la aplicación. Anteriormente comentamos que estos métodos reciben dos parámetros, uno el patrón o URI que queremos registrar y otro la función con el código a ejecutar.

Route::get('/probando/ruta', function(){
	//código a ejecutar cuando se produzca esa ruta y el verbo 
	return 'get';
});

Route::post('/probando/ruta', function(){
	//código a ejecutar cuando se produzca esa rutay el verbo POST
	return 'post';
});

Route::put('/probando/ruta', function(){
	//código a ejecutar cuando se produzca esa rutay el verbo PUT
	return 'put';
});

Route::delete('/probando/ruta', function(){
	//código a ejecutar cuando se produzca esa rutay el verbo DELETE
	return 'delete';
});
Usar varios verbos a la vez al registrar una ruta

Como puedes imaginar, existen casos en los que te puede interesar registrar una ruta que tenga validez con varios verbos, indicando una única función que los resuelva todos. Esto se puede conseguir mediante dos métodos distintos.

Route::match(['get', 'post, 'put''], '/testing', function () {
    echo  'Ruta testing para los verbos GET, POST, PUT';
});

Como puedes apreciar, el método match requiere un parámetro adicional, el primero, en el que indicamos un array con los verbos que queremos aplicar a esta ruta.

Por otra parte tenemos el método any, que es como un comodín, que sirve para cualquier tipo de verbo del HTTP.

Route::any("/cualquiercosa", function(){
	echo 'La ruta /cualquiercosa asociada a cualquier verbo';
});

Cómo probar los verbos de HTTP

Desde un navegador podrás probar fácilmente cualquier ruta con el verbo GET. Será simplemente escribir la URL en la barra de direcciones del navegador. Sin embargo, para probar el método post necesitarás crearte un formulario. Y si se trata de probar PUT o DELETE la cosa es más complicada porque necesitarías algún tipo de script especial.

Pero hay una alternativa muy cómoda que te permitirá probar cualquier tipo de verbo y enviar cualquier tipo de parámetro en la solicitud HTTP. Se trata de utilizar algún cliente Rest que podemos descargar como complemento en el navegador.

Una posibilidad es Postman, un cliente REST que es muy fácil de usar. Esta extensión disponible en Chrome o también en Firefox.

A través de esta herramienta eres capaz de escribir una URL, el método o verbo de la conexión y a través del envío de la solicitud (botón send) recibir y visualizar la respuesta de Laravel.

Así que con postman ya podemos crear todo tipo de rutas en el sistema de enrutamiento y comprobar qué es lo que está pasando. Como sugerencia os indico justamente eso, probar distintos verbos, crear el código para registrar las rutas y ejecutarlas a través de Postman.

Nota: Si quieres probar rutas diferentes de GET observarás que no se puede. Al intentar hacer post, put o delete te sale un mensaje: "TokenMismatchException".

Esto es debido a que en Laravel está activado un sistema antispam para solicitudes diferentes de GET, potencialmente más peligrosas, por el cual se debe comprobar un token. Hablaremos de ello más adelante. De momento vamos simplemente a desactivarlo.

En el archivo app/Http/Kernel.php encontrarás el "global HTTP middleware stack", osea la pila de middlewares que se ejecutan de manera global en las solicitudes HTTP. Busca la línea que hace la carga de VerifyCsrfToken::class, y coméntala.

//\App\Http\Middleware\VerifyCsrfToken::class,

Conclusión

Hemos hablado de verbos en la solicitud HTTP, y a la vez hemos continuado aprendiendo del sistema de routing de Laravel. Pero nos gustaría que quedase claro que desde el navegador generalmente vas a realizar siempre solicitudes GET, o POST si envias datos de formulario.

Para usar los otros verbos que puedes controlar en Laravel realmente necesitas de un cliente REST, que sea capaz de ejecutar acciones como PUT o DELETE. Tendrán sentido usar en tus rutas cuando estés construyendo un API REST con Laravel.

Autor

Carlos Ruiz Ruso

Consultor tecnológico para el desarrollo de proyectos online especializado en WordPress y el framework Laravel.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Julia

13/4/2017
Agradecimiento
Muchísimas gracias, creo que los amo. Estuve dandome golpes con el error de los verbos sin entender muy bien el por qué no funcionaban el método post y get para una misma URI, todos sus artículos están muy bien redactados y hasta el momento son lo mejor que he encontrado para aprender sobre este framework, los Laracast dejan mucho que desear, lo mismo ocurre con la documentación oficial dicen que se puede hacer pero no que es cada cosa y un claro por qué. ¡Gracias por facilitarle la vida a una estudiante!