PlatesPHP: Sistema de plantillas para Codeigniter 3
PlatesPHP: Sistema de plantillas para Codeigniter 3

Vamos a crear un ejemplo completo para crear una api rest en codeigniter, desde aquí podéis descargar el proyecto de github.

En nuestro caso, haremos el ejemplo de servidor, ya que nos interesa proporcionar datos a nuestros usuarios para consumir, los formatos en los que será devuelta la información serán json, xml, html, csv y array, no sé si hay más, pero creo que con estos tenemos más que suficiente.

Lee atentamente (actualizado 21-03-2015)

Para que el ejemplo te funcione correctamente, descarga la siguiente base de datos y haz la importación a tu dbms preferido.
Base de datos restci

Ahora abre el archivo libraries/Rest_Controller.php y en la línea 1532 reemplaza

Por

Es un método y se estaba llamando cómo una propiedad.

Ahora ya puedes seguir el tutorial completo, cuando finalices, para hacer la llamada a cada recurso, por ejemplo al método user_get del controlador api:

http://localhost/restci/api/user/id/1/x-api-key/8hu8fWMCIhCXyq0U4TP0CMJ9waHkCGNcsrqok8zS

Es preferible utilizar los headers para enviar la x-api-key (revisa si está en minúsculas), esta librería hace la búsqueda de dicha api key de forma implícita, así que puedes enviar dicha api key con su clave y su valor a través de los headers y también comprobará si existe o no.

Nuestro trabajo será el siguiente:

Generación de api keys únicas.

Siguiendo los consejos para crear la api rest en codeigniter, tendremos una tabla llamada keys que será donde se guarden los nuevos datos de cada registro, los campos serán los siguientes:

  • Id: Campo auto incremental.
  • Key: Serán las api keys que vayamos generando, estas deberán ser únicas.
  • Level: Podremos dar distintos niveles a nuestros usuarios, por ejemplo level 1 para obtener datos, level 2 para modificar, level 3 para eliminar etc.
  • Ignore limits: Este campo es muy importante, si lo dejamos en 0, los usuarios no tienen límite de consultas y de acceso a datos, en cambio, si lo dejamos en 1 y creamos las restricciones a nuestros métodos como veremos, se verán limitados a lo que nosotros digamos, super interesante.
  • Id addresses: Este campo va ligado de la mano de is_private_key, si is_private_key lo dejamos en 1, significa que la api key en cuestión es de acceso privado, para esto está el campo ip_addresses, donde, separadas por comas podremos colocar todas las ips a las que deseemos dar acceso, así de sencillo.
  • Date created: Simplemente la fecha de creación de la api key.

Limitando el consumo de servicios

También tendremos una tabla llamada limits, aquí será donde se irá guardando la información sobre el consumo de nuestra api, si tenemos limitado el acceso a un determinado método, el usuario al acceder se creará un registro guardando la url consumida, la api key y el número de veces que se ha visitado, de esta forma, cuando se llegue al límite establecido en el período de una hora, el usuario ya no podrá acceder a este recurso hasta la siguiente hora.

  • Id: Campo auto incremental.
  • Uri: La url consumida que tiene restricciones de límites.
  • Count: Necesario para llevar la cuenta de las peticiones a determinada url por determinada api key.
  • Hour started: Con un campo timestamp determinamos el momento de la primera petición a determinada url, de esta forma, podemos comprobar si realmente ha pasado o no una hora si hemos llegado a pasar el límite.
  • Api key: Aquí es donde se guardan las api keys que han hecho la solicitud.

Guardar las peticiones de nuestra api rest en la tabla logs

Y finalmente tenemos la tabla logs, aquí es donde se van guardando todos los accesos e información a nuestra api, sea o no aceptada, si todo ha ido bien, el campo authorized guardará 1, si no se ha podido procesar la petición, guardará 0, este campo puede ser útil para estadísticas o lo que necesitemos, aparte, tendremos los siguiente campos.

  • Id: Campo auto incremental.
  • Uri: La uri a la que se le han hecho las peticiones.
  • Method: El tipo de petición, pueden ser get, post, put y delete.
  • Params: Aquí, con el uso de la función serialize de php se guarda un array con los datos de la url solicitada.
  • Api Key: Aquí se almacena la api key que ha hecho la petición.
  • Ip Address: La ip que ha consumido el servicio.
  • Time: Campo timestamp que guarda la hora en que se hizo la petición.
  • Authorized: Como hemos dicho, con este campo se pueden guardar las peticiones que han tenido una respuesta correcta, si es 1, todo ha salido bien, si es 0 es que ha ocurrido un error, sea de límites, permisos o cualquier otro tipo.

Con esa información creo que se puede entender perfectamente el funcionamiento interno de la api. Ahora veremos que archivos debemos modificar para poder hacer uso de una api key.

Configuración de la api rest en codeigniter

Lo primero será con el proyecto descargado abrir la carpeta application/config/rest.php y eliminar el código actual por el siguiente, que pasaremos a explicar.

Las cosas más importantes que hemos modificado son:

  • rest_enable_keys: Lo ponemos a true para que nuestra api funcione con api keys, también debemos crear la tabla keys como veremos a continuación.
  • rest_key_name: Aunque no lo hemos modificado, podemos hacerlo, este es el nombre de acceso a nuestra api key en la url, por ejemplo, si nuestra api key se llama X-API-KEY accederíamos a los usuarios con http://localhost/apiRestCodeigniter/api/user/id/userid/format/formato/X-API-KEY/miapikey, pero si aquí le cambiamos el nombre a la key, con por ejemplo udp-key accederíamos con http://localhost/apiRestCodeigniter/api/user/id/userid/format/formato/udp-key/miapikey, así de sencillo.
  • rest_enable_logging: Este campo también lo ponemos a true, de esta forma también tendremos en la tabla logs las peticiones a nuestra api, como ya explicamos previamente.
  • rest_logs_json_params: No lo hemos modificado, pero puede ser útil para, si por ejemplo, en vez de guardar el campo params de la tabla logs como un array con serialize, lo queremos guardar en formato json con json_encode, para esto simplemente lo debemos poner en true.
  • rest_enable_limits: Con este campo en true, decimos que queremos utilizar limites en nuestra api, y que queremos guardarlos en la tabla limits, de esta forma podemos llevar más control como hemos explicado anteriormente.

Y eso es todo, con esa explicación creo que debe quedar bastante claro el papel de este archivo de configuración, es la base de la aplicación.

Ahora es el momento de crear un controlador, un modelo y una vista simplemente para poder crear y procesar un formulario para obtener las api keys. Así que creamos lo siguiente.

Un archivo en application/controllers llamado Register.php y dentro colocamos el siguiente código.

Otro archivo en application/models llamado Register_model.php y dentro creamos el siguiente código.

Y finalmente la vista donde simplemente tendremos un formulario con un botón para solicitar la key, así que nos dirigimos a application/views y creamos un archivo llamado register_view.php, dentro colocamos el siguiente código.

Llegados aquí, ya tenemos la base de datos con las tablas necesarias y un formulario que genera y guarda las api keys para nuestros usuarios, ahora nos quedaría ver como crear el controlador y modelo para que los usuarios pudieran interactuar con nuestra api, así que vamos a ello.

El controlador api

Creamos un controlador llamado Api.php en application/controllers y dentro colocamos el siguiente código.

Como podéis ver, todo está explicado dentro del código, así como la url con la que debemos enlazar nuestras consultas, aunque al final del tutorial veremos como acceder desde otro servidor con jquery y con curl.

El método $this->response es el encargado de devolver los datos en el formato solicitado, por ejemplo, si accedemos a users_get(), al ser un servicio restful, esto trabajo con los verbos http, get, post, put y delete, así que si accedemos a http://localhost/apiRestCodeigniter/api/users/X-API-KEY/miapikey, veamos como no escribimos el get de users, ya que ese es el verbo que estamos utilizando, obtendremos un array en formato json con lo siguiente.

Esto significa que estamos haciendo bien nuestro trabajo, a vosotros está claro que no os funcionará hasta que creemos el modelo con las solicitudes necesarias a la base de datos, también necesitáis introducir una clave válida en lugar de la que hemos colocado.

El modelo api_model

Creamos un nuevo archivo en application/models llamado Api_model.php y dentro colocamos el siguiente código.

Ahora, desde otro archivo php podemos obtener acceso a nuestros recursos de las siguiente formas.

Y si no me equivoco, espero que no :D, eso debe ser suficiente para poder crear nuestra api restful y poder dar servicios para consumir en el formato de archivo que necesitemos.