API Rest para conocer el precio de la electricidad I

@cmdearcos
Grupo TIECs

 

Desde CNomys vamos a implementar una API REST para poder acceder al precio histórico de la electricidad. Aprovechando esta situación voy a realizar una serie de artículos para ayudar a todo aquel que quiera aprender a realizar un servicio REST en PHP y nunca se haya puesto con ello.

La API que vamos a realizar es solo para acceder a los datos (al menos la parte pública), no pudiéndose añadir, ni modificar, ni borrar los datos ya existentes, por lo que simplificando mucho la explicación, vamos a permitir acceder a una serie de datos a través de unas URLs que se podrán invocar por método GET.

¿Cuál es el formato que tendrán las URLs de consulta a la API?. Os pondré el ejemplo para solicitar los precios diarios del mes de enero de 2015: http://pvpc.cmdearcos.es/mes/enero/2015

Para poder tratar esta URL y dar el servicio es necesario modificar el fichero .htaccess para que redirija esta URL a nuestra API REST. Para ello es necesario poner en le fichero .htaccess las siguientes lineas:

php

  1. RewriteEngine On
  2. RewriteBase /
  3. #Si el fichero no es un directorio
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. #Si el fichero no existe
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. #Si el fichero no es un enlace
  8. RewriteCond %{REQUEST_FILENAME} !-l
  9. #Pasa la ruta desde el directorio base ($1) en la variable url al script rest.php
  10. #QSA (QSAppend) permite pasar parámetros en el QUERY STRING después de ? y separados por &
  11. #NC (NoCase) hace que no distinga entre mayúsculas y minúsculas
  12. #L (Last) hace que no se ejecute ninguna instrucción después de ella
  13. RewriteRule ^(.+)$ rest.php?url=$1 [QSA,NC,L]

Una vez hecho esto podemos codificar nuestra API rest. Empezaremos viendo la primera versión del fichero resp.php:

php

  1. <?
  2. require ("classRest.php");
  3. $consulta = new classRest();
  4.  
  5. $queryrest = explode("/", $_GET&#91;'url']);
  6.  
  7. switch($queryrest&#91;0]){
  8.    case hora:
  9.     case dia:
  10.     case mes:
  11.     case periodo:
  12.     default:
  13.         $consulta->urlerror($_GET['url']);
  14. }
  15. ?>

Lo primero que hago es hacer un require del fichero classResp.php que es donde he definido la clase classResp (a continuación entraré en detalle), para posteriormente crear el objeto $consulta de dicha clase.

Luego accedemos al parámetro url, que nos han hecho llegar por método GET. Este es el parámetro que he definido en el fichero .htaccess. Hacemos un explode de dicho parámetro para tener en un array la información separada de la URL y poder tratrarla.

Lo siguiente que hacemos es consultar si el primer parametro de la url es correcto. En nuestro ejemplo mes (http://pvpc.cmdearcos.es/mes/enero/2015). En el case del mes realizaremos el tratamiento necesario para sacar los datos de un mes. En el estado actual del ejemplo no hacemos nada.

Si el primer parámetro ($queryrest[0]) no tiene tratamiento por nuestra parte (todas en el ejemplo actual) llamamos al método urlerror() de la clase classResp, pasando como parámetro la url.

Ahora es el momento de ver la clase classRest:

php

  1. <?
  2. class classRest{
  3.     private $estado = false;
  4.     private $query;
  5.    
  6.     public function urlerror($urlorig){
  7.         $json_data&#91;'estado'] = $this->estado;
  8.        setlocale(LC_ALL, 'es_ES.UTF8');
  9.  
  10.         date_default_timezone_set("Europe/Madrid");
  11.         $json_data['fecha'] = strftime("%a, %d %b %Y %T");
  12.         $json_data['urlquery'] = $urlorig;
  13.        
  14.         $this->publicarJSON(json_encode($json_data));
  15.     }
  16.    
  17.     private function publicarJSON ($json){
  18.         header('Content-Type: application/json');
  19.         echo $json;        
  20.     }
  21.    
  22. }
  23. ?>

El método urlerror() crea un array con la información de error: estado a false, fecha y hora de la petición y url. Además crea el JSON con dicho array y por último lo mando al cliente. Para que el cliente reciba correctamente un JSON es necesario cambiar la cabecera con la función header (en línea 18) para indicar que se manda un JSON en vez de HTML.

La salida, siempre que tengáis una extensión para leer JSON desde un navegador WEB, sería similar a la siguiente:

query rest

 

Aprovecho este momento para hablar de un error muy común y que suele provocar comentarios del tipo “setlocale no funciona“. Si después de utilizar setlocale se utiliza la función date para capturar la fecha/hora, ésta no tendrá el formato del idioma especificado en setlocale. Después de setlocale debéis utilizar strftime.

En siguientes artículos seguiré desde este punto para ir ampliando la funcionalidad.

 

@cmdearcos
Grupo TIECs

3 pensamientos en “API Rest para conocer el precio de la electricidad I

  1. Pingback: Cómo implementar una API REST en PHP para acceder al precio de la electricidad

  2. Pingback: API Rest para conocer el precio de la electricidad II | TIECs

  3. Pingback: Nuevo servicio para la obtención del precio de la electricidad | Eficiencia Energética – CNomys

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *