Programando Con Yii2 Construyendo una API RESTful

Lo que vas a crear

En esto Programando con la serie Yii2, Estoy guiando a los lectores en el uso del Marco Yii2 para PHP. También te puede interesar mi Introducción al marco Yii, que revisa los beneficios de Yii e incluye una descripción general de las novedades de Yii 2.x.

En el tutorial de hoy, revisaré cómo construir una API REST en Yii para conectar su aplicación a la nube, aplicaciones móviles y otros servicios. Lo guiaré a través de la guía de inicio rápido de la API REST de Yii y le proporcionaré un contexto y ejemplos de solicitudes comunes.

Comenzando con las API de REST de Yii

Crear API REST en Yii es en realidad bastante sencillo. Puede aprovechar el marco MVC existente, pero está creando un punto de acceso distinto al que pretende acceder mediante diferentes tipos de servicios (no visitantes del sitio web).

Los beneficios del marco Yii REST

El Marco Yii proporciona un amplio soporte y documentación detallada para la creación de API. Estas son algunas de las capacidades incorporadas al crear API:

  • Creación rápida de prototipos con soporte para API comunes para Active Record. Esto le permite exponer rápida y fácilmente la funcionalidad CRUD del modelo de datos a través de una API.
  • Negociación del formato de respuesta (que admite JSON y XML de forma predeterminada). Hay soporte incorporado para devolver datos en formatos de salida comunes.
  • Serialización de objetos personalizable con soporte para campos de salida seleccionables. Es fácil modificar qué datos se devuelven.
  • Formato adecuado de los datos de recolección y errores de validación..
  • Soporte para hipermedia como el motor del estado de la aplicación (HATEOAS)
  • Enrutamiento eficiente con la correcta verificación de verbos HTTP.
  • Soporte incorporado para el OPCIONES y CABEZA verbos.
  • Autenticacion y autorizacion.
  • Almacenamiento en caché de datos y almacenamiento en caché HTTP.
  • Límite de velocidad.

No tendré la oportunidad de tocar todo esto hoy.

Mi interés en las API de REST

En este episodio, construiré una API para permitirnos manipular la tabla de elementos que creé en el servicio Twixxr de este tutorial de la API de Twitter. Pero también planeo crear una API para nuestro enfoque de la serie de tutoriales de inicio, el Planificador de reuniones. Será necesaria una API segura para crear una aplicación iOS para el servicio. La API permitirá la comunicación entre la aplicación móvil y el servicio en la nube..

Construyendo el controlador REST

Con el marco REST de Yii, crearemos un punto final para nuestra API y organizaremos los controladores para cada tipo de recurso.

Los recursos son esencialmente los modelos de datos de nuestra aplicación. Estos extienden yii \ base \ Modelo. 

La clase yii \ rest \ UrlRule proporciona enrutamiento predefinido que mapea nuestro modelo de datos a puntos finales CRUD de API:

Creación de un árbol para actuar como un punto final de API

En la plantilla Yii2 Advanced, hay un front-end y back-end tree, y esto es extensible. Para separar las características de la API, crearemos un tercer árbol para que actúe simplemente como un punto final de la API.. 

El desarrollador de Yii, Alex Makarov, proporciona esta útil guía para crear árboles adicionales que seguí para crear mi tercer árbol:

$ cp -R backend api $ cp -R ambientes / dev / backend / ambientes / dev / api $ cp -R ambientes / prod / backend / ambientes / prod / api 

Luego, utilicé el editor Atom para hacer una búsqueda y reemplazo global de "backend" por "api" en el nuevo árbol de api.

Y agregué el alias de api a /common/config/bootstrap.php:

Configuración del enrutamiento de URL para solicitudes entrantes

En /api/config/main.php, necesitamos agregar el solicitud[] para analizar la configuración de análisis JSON y la UrlRule Asociar métodos para los modelos y sus puntos finales:

return ['id' => 'app-api', 'basePath' => dirname (__ DIR__), 'controllerNamespace' => 'api \ controllers', 'bootstrap' => ['log'], 'modules' => [], 'components' => ['request' => ['parsers' => ['application / json' => 'yii \ web \ JsonParser',],], 'urlManager' => ['enablePrettyUrl' = > true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [['class' => 'yii \ rest \ UrlRule', 'controller' => 'item'], ['class '=>' yii \ rest \ UrlRule ',' controller '=>' user '],],], 

Básicamente, eso es todo lo que se necesita para habilitar alguna funcionalidad de API enriquecida para estos modelos..

Ejemplos con cURL

Vamos a empezar a hacer peticiones.

Solicitando OPCIONES

Mostrar los métodos de API disponibles:

curl -i -H "Aceptar: aplicación / json" -X OPCIONES "http: // localhost: 8888 / api / items"

Aquí está la respuesta (GET, POST, HEAD, OPCIONES):

HTTP / 1.1 200 OK Fecha: martes, 25 de octubre de 2016 20:23:10 GMT Servidor: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered By: PHP / 7.0.10 Permitir: GET, POST, HEAD, OPCIONES Content-Length: 0 Content-Type: application / json conjunto de caracteres = UTF-8 

Solicitudes GET

Solicitud: ¿Cuántos datos hay??

curl -i --head "http: // localhost: 8888 / api / items"

Responder: 576 registros en 29 páginas ...

HTTP / 1.1 200 OK Fecha: martes, 25 de octubre de 2016 23:17:37 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered By: PHP / 7.0.10 X-Pagination-Total-Count: 576 X-Pagination-Page-Count: 29 X- Paginación-Página actual: 1 X-Paginación-Por página: 20 Enlace: ; rel = yo, ; rel = siguiente, ; rel = último tipo de contenido: application / json; conjunto de caracteres = UTF-8 

Solicitud: Muéstrame el record 15:

curl -i "http: // localhost: 8888 / api / items / 15"

Respuesta:

HTTP / 1.1 200 OK Fecha: martes, 25 de octubre de 2016 23:19:27 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered By: PHP / 7.0.10 Content-Length: 203 Content-Type: application / json; charset = UTF-8 "id": 15, "title": "Jeff Reifman", "path": "jeffreifman", "detail": "", "status": 0, "posted_by": 1, "image_url ":" "," favoritos ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0," created_at ": 1477277956," updated_at ": 1477277956 

Solicitud: Muéstrame todos los datos en la página 3:

curl -i -H "Aceptar: application / json" "http: // localhost: 8888 / api / items? page = 3"

Respuesta:

HTTP / 1.1 200 OK Fecha: martes, 25 de octubre de 2016 23:30:21 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered By: PHP / 7.0.10 X-Pagination-Total-Count: 575 X-Pagination-Page-Count: 29 X- Paginación-Página actual: 3 X-Paginación-Por página: 20 Enlace: ; rel = yo, ; rel = primero, ; rel = prev, ; rel = siguiente, ; rel = last Content-Length: 3999 Content-Type: application / json; charset = UTF-8 ["id": 43, "title": "_ jannalynn", "path": "_ jannalynn", "detail": ",, status": 0, "posted_by": 1, "image_url ":" "," favoritos ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0, ... " id ": 99," title ":" alibrown "," path ":" alibrown "," detail ":" "," status ": 0," posted_by ": 1," image_url ":" "," favorites ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 " : 0, "created_at": 1477277956, "updated_at": 1477277956]

BORRAR Solicitudes

Aquí hay un ejemplo de una solicitud GET seguida de una solicitud DELETE y luego un intento GET fallido de seguimiento:

$ curl -i -H "Aceptar: aplicación / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Fecha: martes, 25 de octubre de 2016 23:32:17 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered -Por: PHP / 7.0.10 Content-Length: 186 Content-Type: application / json; charset = UTF-8 "id": 8, "title": "aaker", "path": "aaker", "detail": "", "status": 0, "posted_by": 1, "image_url" : "", "favorites": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Aceptar: aplicación / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 Sin fecha de contenido: martes, 25 de octubre de 2016 23:32:26 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered By: PHP / 7.0 .10 Content-Length: 0 Content-Type: application / json; charset = UTF-8 $ curl -i -H "Aceptar: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 No encontrado Fecha: mar, 25 de octubre de 2016 23:32: 28 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered By: PHP / 7.0.10 Content-Length: 115 Content-Type: application / json; charset = UTF-8 "nombre": "No encontrado", "mensaje": "Objeto no encontrado: 8", "código": 0, "estado": 404, "tipo": "yii \\ web \\ NotFoundHttpException " 

Las solicitudes de un registro eliminado devuelven un error 404.

Solicitudes POST

Para mis solicitudes de publicación, cambié a la aplicación Chrome Postman:

Registrarse para Postman fue fácil:

Y luego pude enviar solicitudes a mi API localhost en una GUI más amigable:

Entonces, recuperé los datos a través de curl, record 577:

$ curl -i -H "Aceptar: aplicación / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Fecha: martes, 25 de octubre de 2016 23:40:44 Servidor GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered -Por: PHP / 7.0.10 Content-Length: 219 Content-Type: application / json; charset = UTF-8 "id": 577, "title": "Jeff Reifman", "path": "reifman", "detail": "Un programador en la tierra.", "status": 0, "posted_by" : 1, "image_url": "", "favorites": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Postman resultó esencial para completar mis pruebas, ya que el enrollamiento de la línea de comandos no fue fácil de configurar para los envíos POST.

Mirando hacia el futuro

Además de su descripción general de inicio rápido de REST, la documentación de Yii 2.0 proporciona detalles sobre una serie de otros aspectos de la creación de API:

  • Recursos
  • Controladores
  • Enrutamiento
  • Formato de respuesta
  • Autenticación
  • Límite de tasa
  • Versiones
  • Manejo de errores

Espero tener la oportunidad de explorar más de estos en futuros episodios. Pero ciertamente, uno de los siguientes pasos es crear una API para el planificador de reuniones en la serie de inicio.

Para terminar, construir una API REST básica con el marco de trabajo de Yii MVC es bastante simple. El equipo de Yii ha hecho un gran trabajo al estandarizar la funcionalidad para un requisito muy importante, las API REST. Espero que hayas disfrutado aprendiendo sobre ellos..

Si tiene alguna pregunta o sugerencia, por favor publíquela en los comentarios. Si desea mantenerse al día con mis futuros tutoriales de Envato Tuts + y otras series, visite la página de mi instructor o siga a @reifman. Definitivamente echa un vistazo a mi serie de inicio y Meeting Planner.

enlaces relacionados

  • Yii2 Developer Exchange, mi sitio de recursos Yii2
  • Inicio rápido - Servicios web RESTful - La guía definitiva para Yii 2.0
  • Google Chrome Store: Aplicación Postman