API Rest para conocer el precio de la electricidad II

@cmdearcos
Grupo TIECs

 

Es el momento de seguir avanzando con la API Rest que iniciamos hace unos días.

Supongamos que tenemos la siguiente base datos (actualizada con los precios de enero de 2015 a fecha de hoy). Aquí os dejo un dump de la base de datos que utilizo de ejemplo en esta serie de artículos:

sql

  1. -- phpMyAdmin SQL Dump
  2. -- version 4.1.8
  3. -- http://www.phpmyadmin.net
  4. --
  5. -- Servidor: localhost
  6. -- Tiempo de generación: 31-01-2015 a las 05:30:29
  7. -- Versión del servidor: 5.5.40-36.1
  8. -- Versión de PHP: 5.4.23
  9.  
  10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  11. SET time_zone = "+00:00";
  12.  
  13.  
  14. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  15. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  16. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  17. /*!40101 SET NAMES utf8 */;
  18.  
  19. --
  20. -- Base de datos: `mc_preciopvpc`
  21. --
  22.  
  23. -- --------------------------------------------------------
  24.  
  25. --
  26. -- Estructura de tabla para la tabla `mensual`
  27. --
  28.  
  29. CREATE TABLE IF NOT EXISTS `mensual` (
  30.   `mes` int(11) NOT NULL COMMENT 'mes del año del 1 al 12',
  31.   `año` int(11) NOT NULL COMMENT 'Año',
  32.   `precio` float NOT NULL COMMENT 'precio de la electricidad para ese mes y año',
  33.   UNIQUE KEY `mes-año` (`mes`,`año`)
  34. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  35.  
  36. --
  37. -- Volcado de datos para la tabla `mensual`
  38. --
  39.  
  40. INSERT INTO `mensual` (`mes`, `año`, `precio`) VALUES
  41. (4, 2014, 0.095084),
  42. (5, 2014, 0.110925),
  43. (6, 2014, 0.119266),
  44. (7, 2014, 0.116649),
  45. (8, 2014, 0.120844),
  46. (9, 2014, 0.130951),
  47. (10, 2014, 0.129899),
  48. (11, 2014, 0.121413),
  49. (12, 2014, 0.12238),
  50. (1, 2015, 0.128864);
  51.  
  52. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  53. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  54. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

El fichero rest.php que recoge las peticiones ha cambiado respecto al del artículo anterior en dos aspecto fundamentales:

  • Ahora le pasamos al constructor de la clase classRest el parámetro url que nos viene desde el fichero .htaccess.
  • Llamar a la función mes cuando se pide los datos de un mes.

Aquí os dejo como quedaría el fichero rest.php:

php

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

Los mayores cambios con respecto el artículo anterior esta en la clase classRest:

  • Se crea un constructor de la clase donde se inicializan valores de la clase y donde se estable la conexión con la base de datos. Es importante decir que hay controlar si se ha efectuado la conexión con la base de datos y en caso de que no se haya podido realizar (por cualquier error de un entorno de producción) se debe tratar dicho error para dar una respuesta adecuada al usuario del servicio. En este ejemplo no se hace.
  • La función urlerror ha sido sustituida por la función error sin parámetros. Esta nueva función pone la variable estado a false y publica el JSON.
  • La función publicarJSON tampoco necesita parámetro, ya que el JSON se define en la variable privada de la clase json_datos, a la que tiene acceso esta función.
  • Se crea la función mes donde se le pasa como parámetros el mes y el año y que es llamada desde rest.php. Esta función lo que hace es:
    • Comprobar que los parámetros pasados son números. Si no lo son devuelve en el JSON “Formato de fecha erróneo”.
    • Comprobar que el mes pedido no es anterior a abril de 2014, mes en el que nació el PVPC. Si se pide un mes anterior a abril de 2014 el JSON devolverá “Fecha menor de abril de 2014”.
    • Si el formato de la petición es correcta y el mes solicitado es mayor de abril de 2014 se realiza la select a la base de datos para sacar el precio que se ha cobrado del mes. Si no hay datos para ese mes el JSON devolverá el siguiente mensaje: “No hay datos para el mes $mes del año $año”, donde $mes y $año son los datos de dichas variables.
    • Si la select devuelve datos el JSON devolverá el mes, el año y el precio para la dupla mes y año.

Aquí os dejo el fichero classRest.php:

php

  1. <?php
  2. class classRest{
  3.     private $estado;
  4.     private $query;
  5.     private $json_datos;
  6.     private $gbd;
  7.    
  8.     public function __construct($url){
  9.         $this->estado = false;
  10.         $this->query = $url;
  11.         setlocale(LC_ALL, 'es_ES.UTF8');
  12.         date_default_timezone_set("Europe/Madrid");
  13.         $this->json_datos = array('estado' => $this->estado, 'fecha' => strftime("%a, %d %b %Y %T"), 'urlquery' => $this->query);
  14.         $this->gbd = new PDO('mysql:host=localhost;dbname=mibasededatos', 'miusuario', 'mipassword');
  15.     }
  16.  
  17.  
  18.     public function error(){
  19.         $this->estado = false;
  20.         $this->publicarJSON();
  21.     }
  22.    
  23.     private function publicarJSON (){
  24.         $this->json_datos['estado'] = $this->estado;
  25.         header('Content-Type: application/json');
  26.         echo json_encode($this->json_datos);        
  27.     }
  28.    
  29.     public function mes ($mes, $año){
  30.         if(!is_numeric($mes) | !is_numeric($año)){
  31.             $this->json_datos['razon_error'] = utf8_encode('Formato de fecha erróneo');
  32.             $this->error();
  33.             return;
  34.         }
  35.        
  36.         if($año < 2014 | ($mes < 4 & $año == 2014)){
  37.             $this->json_datos['razon_error'] = utf8_encode('Fecha menor de abril de 2014');
  38.             $this->error();
  39.             return;
  40.         }
  41.        
  42.         $resultado =  $this->gbd->query("select precio from mensual where año = $año AND mes = $mes;");
  43.         $datos = $resultado->fetchAll();
  44.        
  45.         if(empty($datos)){
  46.             $this->json_datos['razon_error'] = utf8_encode("No hay datos para el mes $mes del año $año");
  47.             $this->error();
  48.             return;            
  49.         }
  50.        
  51.         $this->estado = true;
  52.         $this->json_datos['datos']['m'] = $mes;
  53.         $this->json_datos['datos']['a'] = $año;
  54.         $this->json_datos['datos']['p'] = $datos[0]['precio'];
  55.        
  56.         $this->publicarJSON();
  57.     }  
  58. }
  59. ?>

Ahora voy a probar la aplicación:

http://pvpc.cmdearcos.es/mes

json mes

 

 

 

http://pvpc.cmdearcos.es/mes/3/2014

json mes-3-2014

 

 

 

http://pvpc.cmdearcos.es/mes/1/2015

json mes-1-2015

 

 

 

 

 

En próximos artículos seguiré ampliando la funcionalidad para que os pueda servir como base para vuestros propios desarrollos.

En breve publicaremos en CNomys la API Rest para que podáis descargaros todos los datos relacionados con el precio de la electricidad.

 

@cmdearcos
Grupo TIECs

2 pensamientos en “API Rest para conocer el precio de la electricidad II

  1. Pingback: API Rest para conocer el precio de la electricidad II

  2. 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 *