Trabajar con servicios RESTful en CodeIgniter

CodeIgniter se está volviendo bien conocido por su poder como un marco de aplicación web basado en PHP, pero no es frecuente que veamos ejemplos de que se use para otra cosa. Hoy aprenderemos cómo podemos usar CodeIgniter para crear una API RESTful para sus aplicaciones web existentes y demostrar cómo interactuar con su propia API u otros servicios web RESTful, como Facebook y Twitter..

Como sabrá, puede encontrar una amplia selección de scripts y aplicaciones CodeIgniter en Envato Market, desde scripts de membresía a administradores de menú y mucho más..

Detalles del tutorial

  • Programa: CodeIgniter, CodeIgniter REST server y CodeIgniter REST client
  • Dificultad: Medio
  • Tiempo estimado de finalización: 30 minutos

Introducción

Si has estado siguiendo el CodeIgniter desde cero Ya sabrá que es relativamente rápido y fácil armar aplicaciones web simples, como blogs, sistemas CMS, sitios de folletos, etc. Una cosa en la que puede no haber pensado es usar CodeIgniter para crear una API interactiva. Después de probar varias implementaciones REST existentes, descubrí que no solo carecían de simplicidad, sino que también faltaban la mayoría de las características que cabría esperar de una implementación REST completa; Así que construí mi propio. Este tutorial le mostrará cómo usar este código para configurar su API REST, y le dará un ejemplo de cómo interactuar con él desde su aplicación web..

Suposiciones

  1. Tiene un servidor web configurado, local o en línea y sabe cómo administrar archivos en él..
  2. Has leído algunos de los tutoriales de CodeIgniter de Scratch.
  3. Usted sabe cómo configurar CodeIgniter.
  4. Sabes un poco sobre los servicios RESTful.

Este tutorial se divide en dos partes. Comenzaremos por aprender cómo crear un servicio REST, y luego más abajo, aprenderemos cómo interactuar con él de diferentes maneras..

Parte 1 - Creación de una API RESTful

Paso 1: Configuración de la demostración

Primero debe descargar el código codeigniter-restserver de GitHub y extraerlo y mover el código a su servidor..

Cuando abra la carpeta, verá una instalación completa de CodeIgniter, que está allí para impulsar la demostración. Esto le permite a las personas jugar con la demostración REST antes de integrarse con su aplicación existente.

Abrir "aplicación / config / config.php" y establece la base_url para que los enlaces funcionen. Este base_url será diferente para cada persona y depende completamente de donde subiste tus archivos.

Paso 2: Las URLs

Con los archivos extraídos y el conjunto base_url, estamos listos para cargar nuestra instalación RESTful CodeIgniter, y echar un vistazo a la demostración suministrada con él. Examine la URL base, que por defecto es:

http: // localhost / restserver

Aquí encontrará algunos enlaces de ejemplo a example_api controlador, que se puede encontrar en "application / controllers / example_api.php". Analicemos la URL de estos ejemplos para ver qué está pasando. La primera URL es muy simple..

Esta URL se parece mucho a cualquier otra URL CodeIgniter con un controlador y un método, pero notará en este diagrama que el método se denomina "Recurso". REST tiene que ver con los recursos y son esencialmente un nombre dentro de su aplicación, con el que se interactúa (es decir, se agrega, se elimina, se edita, se consulta) según los encabezados HTTP y las cadenas de consulta de URL o los argumentos HTTP.

El formato predeterminado para la salida es XML, que es lo que vemos en este ejemplo básico. Los otros enlaces son ligeramente más grandes y demuestran cómo pasar parámetros y muestran cómo se puede modificar el formato de salida en la URL:

Normalmente, en CodeIgniter, solo pasa los valores de los parámetros, pero un controlador REST acepta cualquier número de parámetros en cualquier orden. Para que esto funcione, necesitamos pasar el nombre del parámetro seguido del valor en pares.

Al final de la URL está el parámetro "formato". Este es un parámetro reservado que modificará el formato de salida de los datos solicitados así:

Al proporcionar tanto al desarrollador de API como a la aplicación cliente la elección de los formatos de datos a utilizar, la API se abre a un público mucho más amplio y se puede usar con más lenguajes de programación y sistemas. Estos tres no son los únicos formatos admitidos, listos para usar que su API REST puede usar:

  • xml - casi cualquier lenguaje de programación puede leer XML
  • json - Útil para JavaScript y cada vez más aplicaciones PHP..
  • csv - abrir con programas de hoja de cálculo
  • html - una tabla HTML simple
  • php - Representación de código PHP que puede ser eval () 'ed.
  • publicar por fascículos - Datos serializados que pueden no ser serializados en PHP

Si bien agregar el formato a la URL no es técnicamente la forma más fácil de cambiar de formato, permite una fácil prueba de navegador y permite a los desarrolladores sin cURL realizar solicitudes GET simples en la API. La forma más RESTABLE es enviar un Tipo de contenido Encabezado HTTP al controlador REST usando cURL, pero eso se explicará más adelante.

Paso 3: El Código

Ahora si te abres aplicación / controllers / example_api.php Inmediatamente encontrará algunas diferencias con los controladores normales de CodeIgniter.

REST_Controller

En el patrón MVC, un controlador es el punto central de la lógica. Se llama cuando un usuario realiza una solicitud y luego, en función de la lógica del controlador, obtiene datos y genera vistas. CodeIgniter contiene su propia lógica sobre cómo debería funcionar un Controlador, pero como estamos haciendo algo diferente, necesitamos que nuestra propia biblioteca REST_Controller contenga su propia lógica relacionada con REST. Así que en lugar de simplemente usar:

 

... necesitarás usar:

 

Trabajando con Recursos

Ahora su controlador vacío está configurado, los siguientes son los métodos o "recursos". Esta es posiblemente la parte más confusa del tutorial si está acostumbrado a cómo funciona CodeIgniter. Básicamente, toma el recurso y el verbo HTTP y los combina para hacer un nombre de método. Así que los dos ejemplos que vimos antes tenían un Recurso de usuario y usuarios. Debido a que ambos se cargaron en el navegador, sabemos que estaba utilizando una solicitud GET y, por lo tanto, se utilizan los dos métodos siguientes:

 

Esto puede parecer un poco extraño, pero le da la posibilidad de usar la misma URL y responder a la solicitud en función del verbo HTTP que se haya utilizado. Si alguien intenta acceder a su API de una manera que no está permitida (en este ejemplo, PUT o DELETE), simplemente responderá con un 404. Si no está seguro acerca de los verbos HTTP, permítame explicarle.

OBTENER

Se utiliza para obtener información sobre un recurso existente. Esto es utilizado por los navegadores cuando ingresa una URL y pulsa ir, o cuando hace clic en un enlace, por lo que es perfecto para obtener información sobre uno de sus recursos REST (como usuario).

ENVIAR

Se utiliza para actualizar un recurso existente con información. Los navegadores lo utilizan para enviar la mayoría de los tipos de formularios en Internet, aunque algunos también utilizan GET al enviar el formulario de acción con una cadena de consulta que contiene los datos del campo..

PONER

La mayoría de los navegadores utilizan menos comúnmente y no son compatibles con PUT, se utiliza para crear un nuevo recurso.

BORRAR

Tampoco es utilizado por muchos navegadores, este verbo HTTP obviamente se usa para eliminar un recurso.

Si ponemos eso en código y permitimos que cada verbo en el recurso usuario se vería así:

 

Accediendo a parámetros y devolviendo datos.

Así que ahora a la API se le ha dado su estructura configurando los recursos y definiendo un método para cada verbo HTTP que deseamos apoyar; necesitamos parámetros para poder usar nuestros modelos y bibliotecas CodeIgniter. Este es uno de los principales beneficios de usar CodeIgniter para nuestra API, ya que podemos usar nuestros modelos y bibliotecas existentes y no tener que volver a codificarlos..

get ('id')); $ this-> response ($ data);  function user_post () $ data = array ('devolvió:'. $ this-> post ('id')); $ this-> response ($ data);  function user_put () $ data = array ('devolvió:'. $ this-> put ('id')); $ this-> response ($ data; function user_delete () $ data = array ('devuelto:'. $ this-> delete ('id')); $ this-> response ($ data);

Este ejemplo contiene cinco nuevas piezas de código:

$ esto-> obtener ()

Se utiliza para devolver variables GET desde una cadena de consulta como esta index.php / example_api / user? Id = 1 o se puede establecer de la manera más CodeIgniter'esque con index.php / example_api / user / id / 1.

$ esto-> publicar ()

Es un alias para $ this-> input-> post () que es el método de CodeIgniter para acceder a las variables $ _POST con protección XSS.

$ esto-> poner ()

Lee los argumentos PUT establecidos en los encabezados HTTP o mediante cURL.

$ esto-> eliminar ()

Lo has adivinado, esto se lee en los argumentos DELETE, también se establece en encabezados HTTP o mediante cURL.

$ esto-> respuesta ()

Envía datos al navegador en cualquier formato de datos solicitado, o por defecto a XML. Opcionalmente, puede pasar un código de estado HTTP para mostrar que ha funcionado o ha fallado. Por ejemplo, si el ID proporcionado no estaba en la base de datos, podría usar $ this-> response (array ('error' => 'User no encontrado.'), 404);

Paso 4: Trabajando con tus modelos

Hasta ahora, hemos estado trabajando con una API de ejemplo en una instalación limpia. Así que el siguiente paso es obtener una API REST que se ejecute desde su base de código existente.

Aunque la descarga viene con una instalación completa de CodeIgniter para la demostración y para permitir que las API se creen desde cero, los únicos dos archivos de importancia son:

  1. aplicación / config / rest.php
  2. aplicación / bibliotecas / REST_Controller.php

Coloque esos dos archivos en su aplicación CodeIgniter y cree un nuevo controlador API.

get ('id')) $ this-> response (NULL, 400);  $ user = $ this-> user_model-> get ($ this-> get ('id')); if ($ user) $ this-> response ($ user, 200); // 200 es el código de respuesta HTTP else $ this-> response (NULL, 404);  function user_post () $ result = $ this-> user_model-> update ($ this-> post ('id'), array ('name' => $ this-> post ('name'), 'email '=> $ this-> post (' email '))); if ($ result === FALSE) $ this-> response (array ('status' => 'failed'));  else $ this-> response (array ('status' => 'success'));  function users_get () $ users = $ this-> user_model-> get_all (); if ($ users) $ this-> response ($ users, 200);  else $ this-> response (NULL, 404); ?>

Esto muestra un ejemplo de API con algunos nombres de modelos genéricos. En el primer método, estamos recogiendo un? Id = XX y se lo pasamos al modelo. Si se encuentran datos, los enviamos a la función $ this-> response () con un estado 200. Si no se encuentra nada, no devuelve ningún cuerpo y un 404 para decir que no se encontró nada. Puede imaginar cómo se podría expandir esto para ejecutar todo tipo de actividades API para su aplicación web.

Paso 5: Asegurando la API

Ahora que su API está construida, necesita protección para que solo los usuarios que tengan acceso puedan interactuar con la API. Para configurar el tipo de inicio de sesión, los nombres de usuario y las contraseñas se abren "application / config / rest.php" dentro de tu código base.

/ * | ----------------------------------------------- --------------------------- | Inicio de sesión REST | ----------------------------------------------- --------------------------- | | ¿Se requiere inicio de sesión y si es así, qué tipo de inicio de sesión? | | "= no se requiere inicio de sesión, 'básico' = inicio de sesión relativamente seguro, 'resumen' = inicio de sesión seguro | * / $ config ['rest_auth'] = 'básico';

Ninguna

Cualquiera puede interactuar con cualquiera de sus controladores API.

BASIC

Un método de inicio de sesión relativamente inseguro que solo debe usarse en redes internas / seguras.

Digerir

Un método de inicio de sesión mucho más seguro que cifra los nombres de usuario y la contraseña. Si desea tener una API protegida que cualquier persona pueda obtener, use digerir.

/ * | ----------------------------------------------- --------------------------- | REST Inicia sesión con nombres de usuario ---------------------------- | | Conjunto de nombres de usuario y contraseñas para iniciar sesión | | array ('admin' => '1234') | * / $ config ['rest_valid_logins'] = array ('admin' => '1234');

La configuración de los usuarios es simple. Cada inicio de sesión es un elemento de matriz, con una clave y un valor. La clave es el nombre de usuario y el valor es la contraseña. Agregue tantos como desee a esta matriz y distribúyalos a cualquiera que use la API.

Parte 2 - Interactuar con servicios RESTful

Ya sea la API que acaba de crear o un servicio público como Twitter, deseará poder interactuar con ella de alguna manera. Al ver que los servicios RESTful funcionan con solicitudes HTTP básicas, es muy fácil hacerlo de varias maneras diferentes.

Diferentes métodos para interactuar con REST

Cada uno de estos diferentes métodos de interacción se mostrará con el código colocado directamente en los métodos del Controlador. Esto es puramente por lo que las demostraciones son más fáciles de leer y normalmente se ubicarían dentro de un modelo o una biblioteca para la correcta separación de MVC.

file_get_contents ()

Usando la muy simple función PHP file_get_contents (), puede realizar una solicitud GET básica. Este es el más básico de todos los métodos, pero vale la pena mencionarlo para esos momentos "rápidos y sucios"..

$ user = json_decode (file_get_contents ('http://example.com/index.php/api/user/id/1/format/json')); echo $ usuario-> nombre;

Vale la pena señalar que, si bien este método no funcionará con la autenticación HTTP Digest, si está utilizando la autenticación HTTP básica, puede usar la siguiente sintaxis para obtener datos de su API RESTful protegida por contraseña:

$ user = json_decode (file_get_contents ('http: // admin: [email protected]/index.php/api/user/id/1/format/json')); echo $ usuario-> nombre;

Hay algunos problemas con el uso de este método: la única forma de establecer encabezados HTTP adicionales es configurarlos manualmente usando la función de flujo de información de flujo (conconfiguración), que puede ser muy complicada para los desarrolladores que son nuevos en el funcionamiento interno de las solicitudes HTTP. Otra desventaja es que solo recibe el cuerpo de la respuesta HTTP en su formato sin procesar, lo que significa que necesita manejar la conversión desde una solicitud muy única.

rizo

cURL es la forma más flexible de interactuar con una API REST, ya que fue diseñada exactamente para este tipo de cosas. Puede configurar encabezados HTTP, parámetros HTTP y mucho más. Este es un ejemplo de cómo actualizar un usuario con nuestro example_api y cURL para realizar una solicitud POST:

 function native_curl ($ new_name, $ new_email) $ username = 'admin'; $ contraseña = '1234'; // Versión JSON alternativa // $ url = 'http://twitter.com/statuses/update.json'; // Configurar y ejecutar el proceso de curl $ curl_handle = curl_init (); curl_setopt ($ curl_handle, CURLOPT_URL, 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); curl_setopt ($ curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ curl_handle, CURLOPT_POST, 1); curl_setopt ($ curl_handle, CURLOPT_POSTFIELDS, array ('name' => $ new_name, 'email' => $ new_email)); // Opcional, elimine esta línea si su API está abierta curl_setopt ($ curl_handle, CURLOPT_USERPWD, $ username. ':'. $ Password); $ buffer = curl_exec ($ curl_handle); curl_close ($ curl_handle); $ result = json_decode ($ buffer); if (isset ($ result-> status) && $ result-> status == 'success') echo 'El usuario ha sido actualizado.';  else echo 'Algo ha ido mal'; 

Interactuar con su API de esta manera funciona bien, pero hay dos problemas con este método:

  1. Utiliza una sintaxis confusa y fea - imagina crear varias aplicaciones basadas en eso.
  2. cURL no está instalado en todos los servidores por defecto.

Para resolver esta sintaxis fea, se ha desarrollado una biblioteca cURL para CodeIgniter que simplifica las cosas enormemente.

La misma solicitud realizada con la biblioteca cURL se vería así:

 function ci_curl ($ new_name, $ new_email) $ username = 'admin'; $ contraseña = '1234'; $ this-> load-> library ('curl'); $ this-> curl-> create ('http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); // Opcional, elimine esta línea si su API está abierta $ this-> curl-> http_login ($ username, $ password); $ this-> curl-> post (array ('name' => $ new_name, 'email' => $ new_email)); $ result = json_decode ($ this-> curl-> execute ()); if (isset ($ result-> status) && $ result-> status == 'success') echo 'El usuario ha sido actualizado.';  else echo 'Algo ha ido mal'; 

Mucho mejor para mirar a la derecha? Bueno, hay un método aún más fácil para trabajar con REST en sus aplicaciones CodeIgniter que este.

Biblioteca de clientes REST

Se ha desarrollado una biblioteca de clientes REST que se encuentra sobre esta biblioteca cURL que maneja la conversión de formato, los inicios de sesión HTTP y varios otros aspectos de su API REST.

 function rest_client_example ($ id) $ this-> load-> library ('rest', array ('server' => 'http: //localhost/restserver/index.php/example_api/,' http_user '=>' admin ',' http_pass '=>' 1234 ',' http_auth '=>' basic '// o' digest ')); $ user = $ this-> rest-> get ('user', array ('id' => $ id), 'json'); echo $ usuario-> nombre; 

Aquí puede ver que estamos haciendo una solicitud GET, enviando ID como parámetro y diciendo a la biblioteca que queremos "json" como formato de contenido. Esto controla la configuración del tipo de contenido para usted, y convierte los datos en un objeto PHP para usted. Puede cambiar este valor a 'xml', 'json', 'serialize', 'php', 'csv' o cualquier tipo MIME personalizado que desee, por ejemplo:

 $ user = $ this-> rest-> get ('user', array ('id' => $ id), 'application / json');

Como probablemente haya adivinado además de $ this-> rest-> get (), la biblioteca también admite $ this-> rest-> post (), $ this-> rest-> put (), $ this-> rest -> delete () para coincidir con todos sus métodos REST_Controller.

Necesitará los resultados var_dump () provenientes de la biblioteca del cliente REST para asegurarse de que está obteniendo el formato de datos correcto. La conversión será algunas veces una matriz y, a veces, un objeto, dependiendo de cómo se convierta mediante PHP. Si el tipo MIME devuelto no es compatible, simplemente devolverá el formato como texto sin formato.

Hablando con twitter

Usando esta biblioteca REST puede hablar de otros servicios REST, como Twitter y Facebook. Este es un ejemplo simple de cómo puede obtener detalles para un usuario específico según su ID, utilizando el formato XML predeterminado de Twitter..

 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/')); $ user = $ this-> rest-> get ('users / show', array ('screen_name' => 'philsturgeon'));
 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/', 'http_user' => 'username', 'http_pass' => 'password', ' http_auth '=>' básico ')); $ user = $ this-> rest-> post ('statuses / update.json', array ('status' => 'Usando el cliente REST para hacer cosas'));

Al observar esto, notará que la interacción con la API de Twitter es un poco diferente de varias maneras..

  1. Admiten el cambio de formato basado en URL en la forma de .json en lugar de / format / json. Algunos requieren una extensión, otros no; así que es mejor agregarlos siempre.
  2. En su mayoría, solo son compatibles con GET / POST, pero comienzan a agregar más métodos DELETE
  3. No siempre tienen solo un recurso en su URL, por ejemplo: usuarios / búsqueda Es un método REST, pero liza es otro.

Esté atento a estas diferencias, ya que pueden atraparlo. Si te quedas atascado, simplemente repite $ this-> rest-> debug () para una amplia gama de información en tu solicitud REST.

Resumen

Combinando lo que ya sabe sobre los servicios RESTful, la biblioteca cliente REST CodeIgniter y la documentación de la API de Twitter, o cualquier otra documentación de la API RESTful, puede crear algunas aplicaciones muy poderosas que se integran con cualquier servicio web personalizado o público utilizando REST. Puedes ampliar tu API creando más REST_Controller e incluso crear una API modular utilizando Matchbox o Modular Separation para crear un controlador api.php para cada módulo para ayudar a mantener tu API tan bien organizada como tu aplicación.

Síganos en Twitter o suscríbase a Nettuts + RSS Feed para obtener los mejores tutoriales de desarrollo web en la web. Y no se olvide de revisar los útiles scripts y aplicaciones CodeIgniter en Envato Market.