APP PHPRunner cliente RESTfull API

Wikipedia. Definición

La transferencia de estado representacional (en inglés representational state transfer) o REST es un estilo de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web. El término se originó en el año 2000, en una tesis doctoral sobre la web escrita por Roy Fielding, uno de los principales autores de la especificación del protocolo HTTP y ha pasado a ser ampliamente utilizado por la comunidad de desarrollo.

Si bien el término REST se refería originalmente a un conjunto de principios de arquitectura, en la actualidad se usa en el sentido más amplio para describir cualquier interfaz entre sistemas que utilice directamente HTTP para obtener datos o indicar la ejecución de operaciones sobre los datos, en cualquier formato (XML, JSON, etc.) sin las abstracciones adicionales de los protocolos basados en patrones de intercambio de mensajes, como por ejemplo SOAP. Es posible diseñar sistemas de servicios web de acuerdo con el estilo arquitectural REST de Fielding y también es posible diseñar interfaces XMLHTTP de acuerdo con el estilo de llamada a procedimiento remoto (RPC), pero sin usar SOAP. Estos dos usos diferentes del término REST causan cierta confusión en las discusiones técnicas, aunque RPC no es un ejemplo de REST.

REST afirma que la web ha disfrutado de escalabilidad como resultado de una serie de diseños fundamentales clave:

  • Un protocolo cliente/servidor sin estado: cada mensaje HTTP contiene toda la información necesaria para comprender la petición. Como resultado, ni el cliente ni el servidor necesitan recordar ningún estado de las comunicaciones entre mensajes. Sin embargo, en la práctica, muchas aplicaciones basadas en HTTP utilizan cookies y otros mecanismos para mantener el estado de la sesión (algunas de estas prácticas, como la reescritura de URLs, no son permitidas por REST)
  • Un conjunto de operaciones bien definidas que se aplican a todos los recursos de información: HTTP en sí define un conjunto pequeño de operaciones, las más importantes son POST, GET, PUT y DELETE. Con frecuencia estas operaciones se equiparan a las operaciones CRUD en bases de datos (CLAB en castellano: crear, leer, actualizar, borrar) que se requieren para la persistencia de datos, aunque POST no encaja exactamente en este esquema.
  • Una sintaxis universal para identificar los recursos. En un sistema REST, cada recurso es direccionable únicamente a través de su URI.
  • El uso de hipermedios, tanto para la información de la aplicación como para las transiciones de estado de la aplicación: la representación de este estado en un sistema REST son típicamente HTML o XML. Como resultado de esto, es posible navegar de un recurso REST a muchos otros, simplemente siguiendo enlaces sin requerir el uso de registros u otra infraestructura adicional.

 

Imagen explicativa de los servicios RESTfull API

En esta imagen se reflejan los principales usos de los servicios REST. Como podéis comprobar hay 2 formas de usarlos.

(1).- Es la forma más habitual. Las aplicaciones APP (Android e IOS) consumen los datos y objetos de negocios que le ofrecen los servidores de las empresas. También, los navegadores (Chrome, Firefox, MS Edge, Safari, Opera, etc.) son cliente de estos servicios, utilizando estos desde el lenguaje de javascript.

(2).- Esta es la forma que utiliza PHPRunner. En este caso es una aplicación del servidor (PHP) quién utiliza los servicios para después presentar los datos en un navegador.

Publicación de servicios RESTfull API

Prácticamente todas las administraciones públicas disponen de sus publicaciones de datos abiertos y es muy normal que estos se ofrezcan en formato JSON.

https://datos.gob.es/ es la web de estos datos del gobierno de España.

También existen otras empresas que ofrecen datos que ellos recopilan y para facilitar el uso de los mismos lo ofrecen a través de este protocolo/arquitectura.

https://rapidapi.com/ es un ejemplo y es donde he accedido a los datos de un servicio gratis que ofrece los datos del COVID 19 de todo el mundo.

https://rapidapi.com/api-sports/api/covid-193

 

¿Qué tiene el ejemplo?

La aplicación lo que quiere mostrar es un ejemplo completo que muestre las funcionalidades nuevas que incorpora la versión 10.4, ahí es donde más me extenderé, para que pueda servir de ayuda a aquellos de vosotros que deseéis probar estas funcionalidades.

También, y como complemento, os mostraré que podemos acceder a estos datos y mostrarlos en tablas “temporales” y podréis apreciar que todo funciona muy rápido. Esta funcionalidad también puede ser importante porque no requiere de la versión 10.4 y se puede utilizar desde cualquier versión de PHPRunner.

El Servidor tiene 3 métodos:

  • Coutries. Facilita el nombre de todos los países.
  • Statistics. Facilita la situación actual de Covid 19 en todos los países.
  • History. Facilita la información de cualquier país a una fecha anterior a hoy.

Como se muestra en la figura, existen las opciones de menú que utilizan la nueva funcionalidad de la versión 10.4 y el otro conjunto de opciones que utiliza una tabla “temporal” para mostrar los datos recuperados de RESTfull Api.

DEMO: https://fhumanes.com/covid_19

Explicaciones de las nuevas funciones de la versión 10.4

(1).- Hay que definir la conexión del servicio. En este caso los datos de se muestran en esta imagen.

(2).- Una vez que tenemos la conexión debemos empezar a definir vistas de REST, de acuerdo a los métodos que nos ofrezca el servicio y que queramos utilizar en la aplicación.

(3).- Sale esta pantalla popup y hay que asignar el nombre. Lo normal es que coincida con el nombre del método del servicio.

(4).- Cuando deseemos, una vez que hayamos creado la vista, pasar a su definición, seleccionamos la vista (haciendo clic en ella) y pulsamos el botón “Next” que está en el punto (5).

(1).- Podemos seleccionar el recurso que deseemos configurar.

(2).- En las distintas solapas se configura cada una de las acciones sobre el recurso. En el ejemplo sólo están configuradas “list” y “single” (3), que vienen a ser “list” y “view” de las tablas.

(4).- Desde ese botón se puede ir a la configuración del Recurso y su sistema de seguridad.

(5).- Se indica el método del Recurso. Si tuviese parámetros por GET, también irían ahí. En el caso del método “history” ahí irá “history?country=:{search.country}&day=:{search.day}”, para indicar que se pasan los parámetros de “country” y “day”. En este caso los recogemos del panel de búsqueda.

(6).- Si la petición es por PUT, en este punto irán los parámetros.

(7).- En este botón se hace un test de la petición y mostrará la respuesta del servicio en el punto (8).

(8).- Muestra la respuesta al haber pulsado el botón (7). Es muy importante el símbolo de (+) y el “portapapeles”. Con el (+) se añade el campo en la lista (9) y con el “portapapeles” que principalmente se utilizará en la configuración de “single”, lleva el ptah de transformación del acceso a los datos del JSON.

(9).- Es la lista de campos que deseamos tratar en la acción “list”. Desde ahí podemos modificar lo que ha copiado de forma automática al pulsar el botón de (+).

(3).- Es el nombre del campo que se va utilizar en la parte de diseño, etc.

(4).- Es el tipo dependiendo del valor de ese campo. También marca la forma de presentación en diseño.

(5).- Es el path de acceso al JSON para LIST. Este mejor dejar lo que el sistema pone de forma automática al pulsa el “+” (1).

(6).- Es el path de acceso al JSON de SINGLE. En este caso hay que hacer el test, botón “Run request” y utilizando el botón “portapapeles” (2) copiar el valor y pegar en el punto (6).

Explicación de cómo acceder a los datos sin la versión 10.4

Para poder acceder a los datos de un RESTfull API, he utilizado una librería de PHP “unirest” versión 3.0.4, que es la que recomienda la web https://rapidapi.com/.

Os puede surgir un problema al acceder con protocolo HTTPS y esto es porque en vuestro fichero de configuración de PHP «php.ini» esta sección la debes de completar.

 [curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
;curl.cainfo =
curl.cainfo="C:/PHP/certficados/cacert.pem"

Podéis descargar este fichero de CA ( Autoridades de Certificación) autorizadas de https://curl.haxx.se/ca/cacert.pem

Esta forma de acceso a los datos de recursos RESTfull API se puede utilizar desde cualquier versión de PHPrunner, ya que sólo depende de la versión de PHP y en este caso, creo, que exige la versión 5.3

Como vamos a utilizar unas tablas para poder presentar los datos, es importante:

  • Que el sistema de almacenamiento de las tablas sea “MyISAM” y no “innoDB”. Las tablas “MyISAM” son muy rápidas para cargar y borrado de registros.
  • Utilizo el campo “SessionName”, con el nombre de la sesión de cada usuario para que aunque los datos estén en la misma tabla, cada usuario tenga sus propios datos.

Muestro algunos ejemplos.

 <?php
@ini_set("display_errors","1");
@ini_set("display_startup_errors","1");

require_once __DIR__ . '/../../ComponentCode/unirest_3.0.4/autoload.php'; 

$session_name = session_id();
// Consultar si ya están cargados | Check if they are already loaded
$sql=" SELECT count(*) row_num FROM covid_country where SessionName = '$session_name' ";
$resql=db_query($sql,$conn);
$row=db_fetch_array($resql);
if ($row['row_num'] == 0) { // Load Conuntry in session
      // Delete the Countries of session
      $sql="delete FROM covid_country where SessionName = '$session_name' ";
      $resql=db_query($sql,$conn);

      $response = Unirest\Request::get("https://covid-193.p.rapidapi.com/countries",
  array(
    "X-RapidAPI-Host" => "covid-193.p.rapidapi.com",
    "X-RapidAPI-Key" => "4bc3052c61msh7345bc8ec10474ap10192ejsn016e636a3859"
            )
      );
      $a = $response->code;        // HTTP Status code
      $b = $response->headers;     // Headers
      $c = $response->body;        // Parsed body
      $d = $response->raw_body;    // Unparsed body
      $f = json_decode($d,true);
      // var_dump($f); // DUMP pf array
      $count = count($f["response"]);

      foreach($f["response"] as $response) {
            $country = $response;
            $sql="insert INTO covid_country (SessionName,Country) VALUES ('$session_name','$country') ";
            $resql=db_query($sql,$conn);
      }

} // End  row_num == 0
 <?php
@ini_set("display_errors","1");
@ini_set("display_startup_errors","1");

require_once __DIR__ . '/../../ComponentCode/unirest_3.0.4/autoload.php'; 

function valueToZero($val){
    return empty($val)?0:$val;
}

$session_name = session_id();

      // Delete the covid_statistics of session
      $sql="delete FROM covid_statistics where SessionName = '$session_name'";
      $resql=db_query($sql,$conn);

      $response = Unirest\Request::get("https://covid-193.p.rapidapi.com/statistics",
  array(
    "X-RapidAPI-Host" => "covid-193.p.rapidapi.com",
    "X-RapidAPI-Key" => "4bc3052c61msh7345bc8ec10474ap10192ejsn016e636a3859"
            )
      );
      $a = $response->code;        // HTTP Status code
      $b = $response->headers;     // Headers
      $c = $response->body;        // Parsed body
      $d = $response->raw_body;    // Unparsed body
      $f = json_decode($d,true);
      // var_dump($f); // DUMP pf array
      $count = count($f["response"]);

      foreach($f["response"] as $response) {
            // $SessionName,
            $country = $response['country'];
            $day  = $response['day'];
            $CasesNew = $response['cases']['new'];
            $CasesActive = $response['cases']['active'];
            $CasesCritical = $response['cases']['critical'];
            $CasesRecovered = $response['cases']['recovered'];
            $CasesTotal = $response['cases']['total'];
            $DeathsNew = $response['deaths']['new'];
            $DeathsTotal = $response['deaths']['total'];
            $TestTotal = $response['tests']['total'];
            
            $CasesNew = valueToZero($CasesNew); // if Null = 0
            $CasesActive = valueToZero($CasesActive); // if Null = 0
            $CasesCritical = valueToZero($CasesCritical); // if Null = 0
            $CasesRecovered = valueToZero($CasesRecovered); // if Null = 0
            $CasesTotal = valueToZero($CasesTotal); // if Null = 0
            $DeathsNew = valueToZero($DeathsNew); // if Null = 0
            $DeathsTotal = valueToZero($DeathsTotal); // if Null = 0
            $TestTotal = valueToZero($TestTotal); // if Null = 0

            $sql="insert INTO covid_statistics 
                 (SessionName,country,dataDay,CasesNew,CasesActive,CasesCritical,CasesRecovered,CasesTotal,DeathsNew,DeathsTotal,TestTotal) 
          VALUES ('$session_name','$country','$day',$CasesNew,$CasesActive,$CasesCritical,$CasesRecovered,$CasesTotal,$DeathsNew,$DeathsTotal,$TestTotal)";
            $resql=db_query($sql,$conn);
            
      }

 

En el método de “History”, vemos que presenta el panel con los campos de “country” y “Day”. El campo Country tiene definido un lookup del recurso “Countries”. No he podido indicar que “Day”, tiene el tipo fecha porque el parámetro requiere el formato «aaaa-mm-dd», ejemplo, 2020-04-26, y no he sabido cómo configurarlo.

Os adjunto todo el código para que lo podáis instalar en vuestros equipos.

Para cualquier duda o precisión, contactar conmigo a través del email [email protected]

 

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner