Laravel 4 Un comienzo en una API RESTful (actualizada)

¡Las API de RESTful son difíciles! Hay muchos aspectos para diseñar y escribir uno exitoso. Por ejemplo, algunos de los temas que puede manejar incluyen autenticación, hipermedia / HATEOS, control de versiones, límites de velocidad y negociación de contenido. Sin embargo, en lugar de abordar todos estos conceptos, concentrémonos en los conceptos básicos de REST. Haremos algunos puntos finales JSON detrás de un sistema de autenticación básico y aprenderemos algunos trucos de Laravel 4 en el proceso..

Si necesita ayuda con su desarrollo de Laravel, pruebe algunos de los scripts y complementos útiles de Laravel disponibles en Envato Market.


La aplicación

Construyamos una API para una aplicación simple de Read-It-Later. Los usuarios podrán crear, leer, actualizar y eliminar las URL que deseen leer más adelante.
Listo para sumergirse y comenzar?

Instala Laravel 4

Cree una nueva instalación de Laravel 4. Si está familiarizado con CLI, pruebe esta guía de inicio rápido. De lo contrario, tenemos un video tutorial aquí en Nettuts + que cubre el proceso..

Primero vamos a crear una clave de cifrado para el hashing de contraseña seguro. Puede hacerlo fácilmente ejecutando este comando desde la raíz de su proyecto:

$ php clave artesanal: generar

Alternativamente, puede simplemente editar su app / config / app.php Clave de encriptación:

/ * | ----------------------------------------------- --------------------------- | Clave de cifrado | ----------------------------------------------- --------------------------- | | Esta clave es utilizada por el servicio de cifrado Illuminate y debe configurarse | a una cadena larga y aleatoria, de lo contrario estos valores cifrados no | cuidate. ¡Asegúrate de cambiarlo antes de implementar cualquier aplicación! | * / 'key' => md5 ('esta es una forma de obtener un conjunto de claves de cifrado'),

Base de datos

Una vez que tenga una instalación de trabajo de Laravel 4, podemos comenzar con la diversión. Comenzaremos creando la base de datos de la aplicación..

Esto solo requerirá dos tablas de la base de datos:

  1. Usuarios, Incluyendo un nombre de usuario y contraseña
  2. URLs, Incluyendo una url y descripción

Usaremos las migraciones de Laravel para crear y completar la base de datos.

Configure su base de datos

Editar app / config / database.php y rellénelo con la configuración de su base de datos. Nota: esto significa crear una base de datos para que la use esta aplicación. Este artículo asume una base de datos MySQL.

'connections' => array ('mysql' => array ('driver' => 'mysql', 'host' => 'localhost', 'database' => 'read_it_later', 'username' => 'your_username', 'password' => 'your_password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => ",),),

Crear archivos de migración

$ php artisan migrate: make create_users_table --table = users --create $ php artisan migrate: make create_urls_table --table = urls --create

Estos comandos configuran los scripts de migración básicos que utilizaremos para crear las tablas de la base de datos. Nuestro trabajo ahora es llenarlos con las columnas de tabla correctas..

Editar aplicación / base de datos / migraciones / SOME_DATE_create_users_table.php y añadir a la arriba() método:

public function up () Schema :: create ('users', function (Blueprint $ table) $ table-> incrementos ('id'); $ table-> string ('username') -> unique (); $ tabla-> cadena ('contraseña'); $ tabla-> marcas de tiempo ();); 

Arriba, estamos configurando un nombre de usuario (que debe ser único), una contraseña, así como las marcas de tiempo. Guarda eso, y ahora edita aplicación / base de datos / migraciones / SOME_DATE_create_urls_table.php, y añadir a la arriba() método:

función pública up () Schema :: create ('urls', function (Blueprint $ table) $ table-> incrementos ('id'); $ table-> integer ('user_id'); $ table-> string ( 'url'); $ table-> string ('description'); $ table-> timestamps ();); 

La única nota importante en este fragmento es que estamos creando un enlace entre el url y usuarios mesa, a través de la user_id campo.

Agregar usuarios de muestra

Podemos usar las semillas de Laravel para crear algunos usuarios de muestra.

Crear un archivo dentro de la aplicación / base de datos / semillas carpeta que tiene el mismo nombre que la tabla a la que corresponde; en nuestro caso, UserTableSeeder.php. Añadir:

borrar(); User :: create (array ('username' => 'firstuser', 'password' => Hash :: make ('first_password'))); User :: create (array ('username' => 'seconduser', 'password' => Hash :: make ('second_password'))); 

A continuación, asegúrese de que la clase de sembradora se ejecute cuando la base de datos se inicialice. Editar aplicación / base de datos / semillas / DatabaseSeeder.php:

función pública run () Eloquent :: unguard (); // Agregar o Descomentar esta línea $ this-> call ('UserTableSeeder'); 

Ejecutar las migraciones

Aquí se explica cómo crear esas dos tablas e insertar nuestros usuarios de muestra..

// Crear las dos tablas $ php artisan migrate // Crear los usuarios de ejemplo $ php artisan db: seed

Modelos

Laravel 4 continúa utilizando el excelente ORM Eloquent. Esto hará que el proceso de manejo de las bases de datos sea muy sencillo. Requeriremos un modelo por mesa..

Afortunadamente, Laravel viene con una configuración de modelo de usuario, así que vamos a crear un modelo para nuestra tabla de urls.

Crear y editar archivo aplicación / modelos / Url.php.

 

Autenticación

Los filtros de Laravel pueden manejar la autenticación por nosotros. En particular, Laravel ahora viene con un filtro de autenticación básica, que podemos usar como un modelo de autenticación rápida para usar con nuestras solicitudes de API..

Si abres app / filters.php, verá lo que parece

Ruta :: filtro ('auth.basic', function () return Auth :: basic (););

Solo necesitamos hacer un ajuste. Por defecto, este filtro busca un campo de "correo electrónico" para identificar al usuario. Ya que estamos usando nombres de usuario en lugar de correos electrónicos, solo necesitamos ajustar esa preferencia. Cambiar el Auth :: basic () llame dándole nuestro campo de nombre de usuario como parámetro:

Ruta :: filtro ('auth.basic', function () return Auth :: basic ("username"););

Rutas

Vamos a probar esto. Crear una ruta, llamada testauth, y asegúrese de que nuestra auth.basic el filtro funciona antes.

Editar app / route.php:

Route :: get ('/ authtest', array ('before' => 'auth.basic', function () return View :: make ('hello');));

Podemos probar esto con una solicitud de rizo. Desde tu terminal, intenta apuntar a tu compilación de Laravel. En la mía, se parece a esto (¡Tu URL probablemente será diferente!):

$ curl -i localhost / l4api / public / index.php / authtest HTTP / 1.1 401 Fecha no autorizada: martes, 21 de mayo de 2013 18:47:59 GMT WWW-Autenticación: básica Variante: Aceptar-Codificación Tipo de contenido: texto / html ; charset = UTF-8 Credenciales inválidas

Como puede ver, se detecta una solicitud no autorizada y se devuelve un mensaje de "Credenciales no válidas" con un código de estado 401. A continuación, intente incluir la autenticación básica.

$ curl --usuariousuariousuario: first_password localhost / l4api / public / index.php / authtest HTTP / 1.1 200 OK Fecha: martes, 21 de mayo de 2013 18:50:51 GMT Variar: Aceptar-Codificación Tipo de contenido: texto / html; conjunto de caracteres = UTF-8 

Hola Mundo!

Funcionó!

En este punto, el trabajo de base de nuestra API está hecho. Tenemos:

  • Laravel instalado 4
  • Creamos nuestra base de datos
  • Creamos nuestros modelos
  • Creé un modelo de autenticación.

Creando solicitudes funcionales

Puede estar familiarizado con los controladores RESTful de Laravel. Todavía existen en Laravel 4; sin embargo, también podemos usar los controladores ingeniosos de Laravel, que configuran algunos paradigmas que podemos usar para hacer una interfaz API consistente. Estaremos usando un controlador ingenioso.

Aquí hay un desglose de lo que manejará cada método en el controlador de recursos. Tenga en cuenta que puede eliminar las rutas / resource / create y / resource / id / edit, ya que no necesitaremos mostrar los formularios 'create' o 'edit' en una API.

Crear un controlador de recursos

$ controlador de php artesanal: hacer UrlController

A continuación, configure una ruta para usar el controlador y solicite que cada ruta esté autenticada.

Editar app / route.php y añadir:

// Grupo de ruta para la versión API API Route :: group (array ('prefix' => 'api / v1', 'before' => 'auth.basic'), function () Route :: resource ('url', 'UrlController'););

Algunas cosas están sucediendo allí..

  1. Esto va a responder a las solicitudes hechas a http://example.com/api/v1/url.
  2. Esto nos permite agregar rutas adicionales, si necesitamos expandir nuestra API. Por ejemplo, si agrega un punto final de usuario, como / api / v1 / usuario.
  3. También hay un mecanismo de asignación de nombres para la versión de nuestra API. Esto nos da la oportunidad de implementar nuevas versiones de API sin romper versiones anteriores. Podemos simplemente crear un v2 grupo de rutas, y apuntarlo a un nuevo controlador!

Nota: es posible que desee considerar técnicas de creación de versiones de API más avanzadas, como el uso de un Aceptar encabezado o subdominio que puede ayudarlo a señalar diferentes versiones de API bases de código separadas.

Añadir la funcionalidad

Editar el nuevo app / controllers / UrlController.php expediente:

// Editar esto: índice de función pública () return 'Hello, API'; 

Vamos a probarlo:

$ curl -i localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 401 Fecha no autorizada: martes, 21 de mayo de 2013 19:02:59 GMT WWW-Autenticación: básica Variante: aceptar codificación de contenido : texto / html; charset = UTF-8 Credenciales inválidas. $ curl --usuariousuariousuario: first_password localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 200 OK Fecha: martes, 21 de mayo de 2013 19:04:19 GMT Vary: Aceptar-Codificar tipo de contenido: texto / html; charset = UTF-8 Hola, API

Ahora tenemos un controlador con recursos con la autenticación en funcionamiento, y estamos listos para agregar funcionalidad.

Crear una URL

Editar app / controllers / UrlController.php:

/ ** * Almacenar un recurso recién creado en el almacenamiento. * * @return Response * / public function store () $ url = new Url; $ url-> url = Request :: get ('url'); $ url-> description = Solicitud :: get ('descripción'); $ url-> user_id = Auth :: user () -> id; // ¡¡¡La validación y el filtrado son muy necesarios !! // En serio, soy una mala persona por dejar eso fuera. $ url-> guardar (); return Response :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200); 

Es hora de probar esto con otra solicitud de rizo. Éste enviará una solicitud POST, que corresponderá a la almacenar() método creado arriba.

$ curl -i --user firstuser: first_password -d 'url = http: //google.com&description=A Search Engine' localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 201 Fecha de creación: Mar , 21 de mayo de 2013 19:10:52 GMT Tipo de contenido: aplicación / json "error": falso, "mensaje": "URL creada"

¡Guay! Vamos a crear un poco más, para nuestros dos usuarios..

$ curl - useruser firstuser: first_password -d 'url = http: //fideloper.com&description=A Great Blog' localhost / l4api / public / index.php / api / v1 / url $ curl --user seconduser: second_password -d 'url = http: //digitalsurgeons.com&description=A Agencia de Marketing' localhost / l4api / public / index.php / api / v1 / url $ curl --usuario useruser: second_password -d 'url = http: //www.poppstrong .com / & description = Lo siento por él 'localhost / l4api / public / index.php / api / v1 / url

A continuación, vamos a crear métodos para recuperar URLs..

/ ** * Mostrar una lista del recurso. * * @return Response * / public function index () // Anteriormente: return 'Hello, API'; $ urls = Url :: where ('user_id', Auth :: user () -> id) -> get (); return Response :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200);  / ** * Muestra el recurso especificado. * * @param int $ id * @return Response * / public function show ($ id) // Asegúrese de que el usuario actual posee el recurso solicitado $ url = Url :: where ('user_id', Auth :: user () - > id) -> donde ('id', $ id) -> take (1) -> get (); return Response :: json (array ('error' => false, 'urls' => $ url-> toArray ()), 200); 

Vamos a probarlos:

$ curl --usuariousuariousuario: first_password localhost / l4api / public / index.php / api / v1 / url "error": false, "urls": ["created_at": "2013-02-01 02:39: 10 "," descripción ":" Un motor de búsqueda "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," id_usuario ":" 1 ", " created_at ":" 2013-02-01 02:44:34 "," descripción ":" Un gran blog "," id ":" 3 "," updated_at " : "2013-02-01 02:44:34", "url": "http://fideloper.com", "user_id": "1"] $ curl --user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url / 1 "error": false, "urls": ["created_at": "2013-02-01 02:39:10", "description": "Una búsqueda Engine "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," user_id ":" 1 " ]

Casi termino. Permitamos ahora a los usuarios borrar una url.

/ ** * Eliminar el recurso especificado del almacenamiento. * * @param int $ id * @return Response * / public function destroy ($ id) $ url = Url :: where ('user_id', Auth :: user () -> id) -> find ($ id) ; $ url-> delete (); return Response :: json (array ('error' => false, 'message' => 'url deleted'), 200); 

Ahora, podemos eliminar una URL usando una solicitud DELETE:

$ curl -i -X ​​BORRAR --usuariousuario: first_password localhost / l4api / public / index.php / api / v1 / url / 1 HTTP / 1.1 200 OK Fecha: martes, 21 de mayo de 2013 19:24:19 GMT Content- Escriba: application / json "error": falso, "mensaje": "url eliminado"

Por último, permitamos que los usuarios actualicen una url.

/ ** * Actualizar el recurso especificado en el almacenamiento. * * @param int $ id * @return Response * / actualización de función pública ($ id) $ url = Url :: where ('user_id', Auth :: user () -> id) -> find ($ id) ; if (Request :: get ('url')) $ url-> url = Request :: get ('url');  if (Request :: get ('description')) $ url-> description = Request :: get ('description');  $ url-> save (); return Response :: json (array ('error' => false, 'message' => 'url updated'), 200); 

Para probar las actualizaciones de URL, ejecute:

$ curl -i -X ​​PUT --usuariousuario: second_password -d 'url = http: //yahoo.com' localhost / l4api / public / index.php / api / v1 / url / 4 HTTP / 1.1 200 OK Fecha: Mar, 21 de mayo de 2013 19:34:21 GMT Content-Type: application / json "error": false, "message": "url updated" // Ver nuestros cambios $ curl --user seconduser: second_password localhost / l4api /public/index.php/api/v1/url/4 "error": false, "urls": ["created_at": "2013-02-01 02:44:34", "description": "I siente por él "," id ":" 3 "," updated_at ":" 2013-02-02 18:44:18 "," url ":" http://yahoo.com "," user_id ":" 1 "]

Y eso es

Ahora tenemos los inicios de una API que funciona completamente. Espero que hayas aprendido mucho sobre cómo iniciar una API con Laravel 4.

Para resumir, logramos lo siguiente en esta lección:

  1. Instalar Laravel
  2. Crea la base de datos, utilizando migraciones y siembra.
  3. Usa los modelos ORM elocuentes.
  4. Autenticar con Autenticación Básica
  5. Configurar rutas, incluida la versión de la API
  6. Crea la funcionalidad de la API usando controladores ingeniosos.

Los siguientes pasos

Si desea aumentar su nivel de API, puede considerar cualquiera de los siguientes como el siguiente paso.

  1. Validación (Consejo: Laravel tiene una biblioteca de validación).
  2. Manejo de errores de solicitud de API: todavía es posible recibir una respuesta HTML en las solicitudes de API (Sugerencia: manejo de errores a nivel de lanza, más negociación de contenido).
  3. Negociación de contenido: escucha el encabezado Aceptar. (Pista: la Clase de Solicitud de Laravel le dará los encabezados de solicitud).
  4. Echa un vistazo a la API Craft Grupo de Google.
  5. Obtenga información sobre los diferentes tipos de almacenamiento en caché y cómo el almacenamiento en caché de validación puede mejorar su API.
  6. Unidad prueba tu código.
  7. Echa un vistazo a los grandes recursos API de Apigee.
  8. Pruebe algunos de los útiles scripts y complementos de Laravel disponibles en Envato Market.