¡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.
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?
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'),
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:
Usaremos las migraciones de Laravel para crear y completar la 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' => ",),),
$ 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.
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');
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
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 pareceRuta :: 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 nuestraauth.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álidasComo 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-8Hola Mundo!
Funcionó!
En este punto, el trabajo de base de nuestra API está hecho. Tenemos:
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.
$ 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í..
http://example.com/api/v1/url
./ api / v1 / usuario
.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.
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.
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 "]
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:
Si desea aumentar su nivel de API, puede considerar cualquiera de los siguientes como el siguiente paso.