Consumiendo una API con PHP

  • by

Actualmente podemos consumir muchos servicios mediante APIs que nos permiten obtener datos de diversos tipos como el clima, resultados e incluso hasta el avance del COVID19, para poder utilizarlos en nuestros sitios o aplicaciones, las API’s se volvieron más comunes con las redes sociales por ejemplo la API de Twitter que permite realizar varias funciones sin tener que accesar directamente al sitio utilizando llaves para identificar tu cuenta, pero bueno empecemos a jugar.

¿Qué es una API?

Una API (Application Programming Interface) es un conjunto de reglas y definiciones específicas que las aplicaciones siguen para comunicarse entre ellas. Las API’s se utilizan para desarrollar e integrar el software de las aplicaciones de ahí su nombre interfaz de programación de aplicaciones.

Las API permiten la comunicación de sus productos y servicios con otros sin necesidad de saber como están implementados, estas se pueden comunicar con diversos sistemas por ejemplo con el sistema operativo (WinAPI), con bases de datos (DBMS) con otros protocolos de comunicación (Jabber/XMPP) y como les mencioné múltiples redes sociales y plataformas en línea.

Las API otorgan flexibilidad, facilitan el diseño, la administración y el uso de aplicaciones sin la necesidad de acceder directamente al programa o código en el caso de programas propietarios que nos permiten utilizar solamente sus respuestas.

Haciendo un llamada a una API

Utilizaremos una API de rapidapi acerca del COVID19 para utilizarla basta registrarnos, rapidaapi nos permite testear la api e incluso nos proporciona código para utilizarla en distintos lenguajes de programación.

Código para llamar la API en PHP

Si seleccionamos el snippet de PHP en cURL nos dará un resultado parecido al siguiente aunque este viene explicado (espero se entienda):

<?php

$curl = curl_init(); //inicia la sesión cURL

curl_setopt_array($curl, array(
	CURLOPT_URL => "https://covid-19-coronavirus-statistics.p.rapidapi.com/v1/stats?country=Mexico", //url a la que se conecta
	CURLOPT_RETURNTRANSFER => true, //devuelve el resultado como una cadena del tipo curl_exec
	CURLOPT_FOLLOWLOCATION => true, //sigue el encabezado que le envíe el servidor
	CURLOPT_ENCODING => "", // permite decodificar la respuesta y puede ser"identity", "deflate", y "gzip", si está vacío recibe todos los disponibles.
	CURLOPT_MAXREDIRS => 10, // Si usamos CURLOPT_FOLLOWLOCATION le dice el máximo de encabezados a seguir
	CURLOPT_TIMEOUT => 30, // Tiempo máximo para ejecutar
	CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, // usa la versión declarada
	CURLOPT_CUSTOMREQUEST => "GET", // el tipo de petición, puede ser PUT, POST, GET o Delete dependiendo del servicio
	CURLOPT_HTTPHEADER => array(
		"x-rapidapi-host: covid-19-coronavirus-statistics.p.rapidapi.com",
		"x-rapidapi-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
	), //configura las cabeceras enviadas al servicio
)); //curl_setopt_array configura las opciones para una transferencia cURL

$response = curl_exec($curl);// respuesta generada
$err = curl_error($curl); // muestra errores en caso de existir

curl_close($curl); // termina la sesión 

if ($err) {
	echo "cURL Error #:" . $err; // mostramos el error
} else {
	echo $response; // en caso de funcionar correctamente
}

cURL es una librería que permite realizar peticiones HTTP con el objetivo de transferir información, permite armar un script que literalmente se comporte como un navegador para así realizar una petición a otro servidor remoto.

Probando cURL en PHP

Antes de empezar debemos tener activado cURL en nuestro servidor si lo tenemos en local asegurarnos que nuestro php.ini no tenga comentada la opción (quitando las comillas que se muestran en el siguiente código) y esté instalado:

;extension=php_curl.dll

Ya que en caso contrario nos mostrará un error parecido al siguiente:

<b>Fatal error</b>:  Uncaught Error: Call to undefined function curl_init() 

Suponiendo que todo esté correcto nos regresará el siguiente json:

{"error":false,"statusCode":200,"message":"OK","data":{"lastChecked":"2020-04-11T20:06:20.272Z","covid19Stats":[{"city":"","province":"","country":"Mexico","lastUpdate":"2020-04-10 22:53:48","keyId":"Mexico","confirmed":3441,"deaths":194,"recovered":633}]}}

Con ello sabemos que nuestro archivo funciona, de acuerdo a la documentación los parámetros son opcionales por lo que podemos eliminar ?country=Mexico y nos dará una lista completa en json.

Si bien ya tenemos una respuesta o varias dependiendo de los parámetros que agreguemos no es tan funcional como para agregarlo así que vamos a parsear el código para tener un resultado más agradable.

Parseando JSON con PHP

PHP nos permite pasear json fácilmente o crear uno nuevo utilizando json_decode() al utilizar la función podemos obtener un objeto o un arreglo simple.

Si aplicamos json_decode() sin parámetros lo tomará como false, y nos regresa un objeto como el siguiente:

json_decode($response);
stdClass Object
(
    [error] => 
    [statusCode] => 200
    [message] => OK
    [data] => stdClass Object
        (
            [lastChecked] => 2020-04-11T21:06:19.985Z
            [covid19Stats] => Array
                (
                    [0] => stdClass Object
                        (
                            [city] => 
                            [province] => 
                            [country] => Mexico
                            [lastUpdate] => 2020-04-10 22:53:48
                            [keyId] => Mexico
                            [confirmed] => 3441
                            [deaths] => 194
                            [recovered] => 633
                        )

                )

        )

)

Ya con nuestro objeto podemos recuperar los datos que queremos por ejemplo fecha de actualización (lastUpdate).

$objeto = json_decode($response);
$objeto->data->covid19Stats[0]->lastUpdate;

Si queremos podemos sacar los datos y acomodarlos de acuerdo a nuestro diseño o necesidad, incluso almacenarlos en una base de datos para usar después, en este ejemplo solamente presentaremos los datos de esta forma:

COVID19 en Mexico
Actualizado: 2020-04-10 22:53:48
Confirmados: 3441
Muertos: 194
Recuperados: 633

Les comparto el código completo sin clave API para que generen la suya y hagan las modificaciones que necesiten:


<?php

$curl = curl_init();

curl_setopt_array($curl, array(
	CURLOPT_URL => "https://covid-19-coronavirus-statistics.p.rapidapi.com/v1/stats?country=Mexico",
	CURLOPT_RETURNTRANSFER => true,
	CURLOPT_FOLLOWLOCATION => true,
	CURLOPT_ENCODING => "",
	CURLOPT_MAXREDIRS => 10,
	CURLOPT_TIMEOUT => 30,
	CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
	CURLOPT_CUSTOMREQUEST => "GET",
	CURLOPT_HTTPHEADER => array(
		"x-rapidapi-host: covid-19-coronavirus-statistics.p.rapidapi.com",
		"x-rapidapi-key: APIKEYAQUÍ"
	),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
	echo "cURL Error #:" . $err;
} else {
	$objeto = json_decode($response);

	echo "COVID19 en ".$objeto->data->covid19Stats[0]->country."<br/>";
	echo "Actualizado: ".$objeto->data->covid19Stats[0]->lastUpdate."<br/>";
	echo "Confirmados: ".$objeto->data->covid19Stats[0]->confirmed."<br/>";
	echo "Muertos: ".$objeto->data->covid19Stats[0]->deaths."<br/>";
	echo "Recuperados: ".$objeto->data->covid19Stats[0]->recovered."<br/>";
	
}

Espero les sirva.

Pueden ver un ejemplo más elaborado y terminado entrando al Lab de Algo.mx o pueden ver su aplicación en producción ya adaptado a WordPress entrando a noticias.red

Deja un comentario

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