Hoy en día existen cientos de criptomonedas y vivimos en un boom especulativo de ellas. Si está en este negocio, es posible que desee mantenerse actualizado con la información de cualquier criptomoneda utilizando la CoinMarketAPI gratuita.
¿Cómo funciona la API?
El CoinMarketAPI expone 3 puntos finales . En este caso, solo usaremos uno de los /ticker
puntos finales para recuperar la información sobre una sola criptomoneda. Esta API devuelve la información de una criptomoneda desde su id en formato JSON:
https://api.coinmarketcap.com/v1/ticker/<Currency ID>/
La API le permite convertir las monedas a las monedas más conocidas del mundo con los siguientes identificadores: "AUD", "BRL", "CAD", "CHF", "CNY", "EUR", "GBP", " HKD "," IDR "," INR "," JPY "," KRW "," MXN "," RUB ":
https://api.coinmarketcap.com/v1/ticker/<Currency ID>/?convert=EUR
Aunque la API es totalmente gratuita, los autores imponen un límite que quizás quieras aplicar al solicitar esta información:
- Limite las solicitudes a no más de 10 por minuto (consulte el paso 3).
Los puntos finales de la API se actualizan cada 5 minutos.
Importante
En este artículo, le explicaremos cómo solicitar la información de una moneda con un cliente http Guzzle simple y uno en caché como debería ser.
1. Instale GuzzleHttpClient
Guzzle es un cliente HTTP de PHP que facilita el envío de solicitudes HTTP y simplifica la integración con los servicios web. Tiene una interfaz realmente simple para crear cadenas de consulta, solicitudes POST, transmitir grandes cargas, transmitir grandes descargas, usar cookies HTTP, cargar datos JSON, etc.
Para realizar una solicitud a la API a través de PHP, necesitará esta biblioteca. Puedes instalarlo usando el siguiente comando del compositor:
composer require require guzzlehttp/guzzle
Alternativamente, modifique el composer.json
archivo y agregue la dependencia manualmente:
{
"require": {
"guzzlehttp/guzzle": "^6.3",
},
}
Y finalmente instálelos usando composer install
. Para obtener más información sobre esta biblioteca, visite el repositorio oficial en Github aquí .
2. Solicita información sobre una criptomoneda
El punto principal del tutorial es sobre cómo recuperar información sobre una criptomoneda como Bitcoin, Ethereum, Litecoin, etc. Usando el cliente Guzzle, hará una solicitud de la misma manera que lo hace con un navegador.
Lo primero que debe hacer es crear una instancia de Guzzle Client. El cliente tiene un método llamado solicitud, que espera como primer argumento el tipo de solicitud y como segundo argumento la URL de la solicitud que desea realizar. En este caso el primer argumento será el GET
formato y como segundo argumento utilizarás la URL de la API CoinMarketCap (con el ID de la criptomoneda que deseas y opcionalmente la conversión de moneda). Una vez que finaliza la solicitud, puede recuperar el cuerpo de la respuesta utilizando el getBody
método del resultado que en este caso será una cadena simple en formato JSON, así que asegúrese de convertirlo en una matriz usando json_decode
. La matriz generada contendrá toda la información que proporciona la API sobre la moneda:
Advertencia
No use el siguiente código en producción, es solo para mostrarle cómo se puede usar el Cliente Guzzle para acceder a la API. ¡Las solicitudes no se almacenan en caché!
Use esto solo en el entorno loca
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// Important: Include the GuzzleClient
use GuzzleHttp\Client;
class DefaultController extends Controller
{
/**
* Index route
*
* @return Response
*/
public function index()
{
// Retrieve information about the bitcoin currency
$bitcoinInfo = $this->getCryptoCurrencyInformation("bitcoin");
// About the Ethereum currency but in Euros instead of United States Dollar
$ethereumInfo = $this->getCryptoCurrencyInformation("ethereum", "EUR");
// And so on with more than 1010 cryptocurrencies ...
// Return a view as response (default.blade.php)
return view("default", [
"bitcoin" => $bitcoinInfo,
"ethereum" => $ethereumInfo
]);
}
/**
* Retrieves the complete information providen by the coinmarketcap API from a single currency.
* By default returns only the value in USD.
*
* WARNING: do not use this code in production, it's just to explain how the API works and how
* can the information be retrieved. See step 3 for final implementation.
*
* @param string $currencyId Identifier of the currency
* @param string $convertCurrency
* @see https://coinmarketcap.com/api/
* @return mixed
*/
private function getCryptoCurrencyInformation($currencyId, $convertCurrency = "USD"){
// Create a new Guzzle Plain Client
$client = new Client();
// Define the Request URL of the API with the providen parameters
$requestURL = "https://api.coinmarketcap.com/v1/ticker/$currencyId/?convert=$convertCurrency";
// Execute the request
$singleCurrencyRequest = $client->request('GET', $requestURL);
// Obtain the body into an array format.
$body = json_decode($singleCurrencyRequest->getBody() , true)[0];
// If there were some error on the request, throw the exception
if(array_key_exists("error" , $body)){
throw $this->createNotFoundException(sprintf('Currency Information Request Error: $s', $body["error"]));
}
// Returns the array with information about the desired currency
return $body;
}
}
En este punto, puede solicitar información sobre las 2 monedas deseadas, a saber, Bitcoin y Ethereum. Como puede ver en nuestra acción de índice, estamos devolviendo una plantilla de hoja, a saber, la predeterminada que contiene la siguiente estructura:
Price of the Bitcoin (USD): <b>$ {{ $bitcoin["price_usd"] }}</b> <br>
Price of the Ethereum (EUR): <b>€ {{ $ethereum["price_eur"] }}</b> <br>
{{-- Dump the entire arrays into the view --}}
{{dd($bitcoin)}}
{{dd($ethereum)}}
Entonces, si accede a la ruta de índice del controlador, obtendrá el siguiente contenido HTML:
Sin embargo, esto no durará más . Si sigue solicitando sin un caché, la API de CoinMarketCap le advertirá que está haciendo demasiadas solicitudes , por lo que deberá implementar un administrador de caché para las solicitudes.
3. Implementar algún sistema de caché
Deberá implementar un administrador de caché para el cliente Guzzle, porque como se mencionó anteriormente, la API es totalmente gratuita y no podemos abusar de ella (además obtendrá una excepción debido a las muchas solicitudes que puede hacer si no implementar un caché "429 Demasiadas solicitudes").
El administrador de caché debe ser implementado por usted de la manera que desee. Para los desarrolladores perezosos que pueden no saber cómo manejar cualquier caché, mostraremos un ejemplo usando un caché del sistema de archivos. Para esto, necesitará instalar 2 bibliotecas adicionales para manejar el Caché, estamos hablando del Componente Cache de Symfony y el Middleware Guzzle Cache. Instale las bibliotecas con Composer ejecutando los siguientes comandos:
REM Install the Cache Component of Symfony:
composer require symfony/cache
REM And install the Cache Middleware for Guzzle:
composer require kevinrob/guzzle-cache-middleware
Después de la instalación, podrá usar sus clases en su propio controlador. Al usar el Cliente en caché de Guzzle que vamos a implementar usando el sistema de archivos en lugar de un cliente simple, aparecerá una nueva carpeta en el directorio de caché de su proyecto laravel (en este caso /bootstrap/GuzzleFileCache
). No olvide otorgar los permisos adecuados para escribir en la carpeta.
El ejemplo crea un nuevo método a saber getGuzzleFileCachedClient
. Este método debe ser privado y devuelve una nueva instancia de un cliente Guzzle (utilizado para solicitar la información sobre una moneda), sin embargo, con una implementación de caché utilizando el componente de caché de Symfony y el middleware de caché de Guzzle. Puede implementar un servicio del cliente para mantener limpio su controlador, pero si solo está probando, hacerlo en el controlador puede ser más fácil y rápido. Como menciona la API, el tiempo de caché perfecto será de 10 minutos (600 segundos). El resto del código en el controlador permanecerá igual, pero en lugar de crear un nuevo cliente, use el que está en caché:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// Important: add the required classes
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Kevinrob\GuzzleCache\CacheMiddleware;
use Kevinrob\GuzzleCache\Storage\Psr6CacheStorage;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;
use Kevinrob\GuzzleCache\Strategy\GreedyCacheStrategy;
class DefaultController extends Controller
{
/**
* Index route
*
* @return Response
*/
public function index()
{
// Recuperar información sobre la moneda bitcoin
$bitcoinInfo = $this->getCryptoCurrencyInformation("bitcoin");
// Acerca de la moneda Ethereum pero en euros en lugar del dólar estadounidense
$ethereumInfo = $this->getCryptoCurrencyInformation("ethereum", "EUR");
//Y así sucesivamente con más de 1010 criptomonedas ...
// Devuelve una vista como respuesta (default.blade.php)
return view("default", [
"bitcoin" => $bitcoinInfo,
"ethereum" => $ethereumInfo
]);
}
/**
* Recupera la información completa proporcionada por la API de coinmarketcap de una moneda única.
* Por defecto devuelve solo el valor en USD.
*
*
* @param string $currencyId Identifier of the currency
* @param string $convertCurrency
* @see https://coinmarketcap.com/api/
* @return mixed
*/
private function getCryptoCurrencyInformation($currencyId, $convertCurrency = "USD"){
// Crear un cliente Guzzle en caché personalizado
$client = $this->getGuzzleFileCachedClient();
// Defina la URL de solicitud de la API con los parámetros proporcionados
$requestURL = "https://api.coinmarketcap.com/v1/ticker/$currencyId/?convert=$convertCurrency";
// Ejecuta la solicitud
$singleCurrencyRequest = $client->request('GET', $requestURL);
// Obtain the body into an array format.
$body = json_decode($singleCurrencyRequest->getBody() , true)[0];
// Si hubo algún error en la solicitud, lanza la excepción
if(array_key_exists("error" , $body)){
throw $this->createNotFoundException(sprintf('Currency Information Request Error: $s', $body["error"]));
}
// Devuelve la matriz con información sobre la moneda deseada.
return $body;
}
/**
* Devuelve un GuzzleClient que usa un administrador de caché, por lo que usará la API sin ningún problema y
* solicita tantas veces como quieras.
*
* La caché dura 10 minutos según lo recomendado en la API.
*/
private function getGuzzleFileCachedClient(){
// Crear un HandlerStack
$stack = HandlerStack::create();
// 10 minutos para mantener el caché
$TTL = 600;
// Recupere la ruta de la carpeta de caché de su proyecto Laravel
$cacheFolderPath = base_path() . "/bootstrap";
// Cree una instancia del almacenamiento en caché: un caché del sistema de archivos PSR-6 con
// una vida útil predeterminada de 10 minutos (60 segundos).
$cache_storage = new Psr6CacheStorage(
new FilesystemAdapter(
// Crear carpeta de caché de archivos Guzzle dentro de la ruta de la carpeta de caché proporcionada
'GuzzleFileCache',
$TTL,
$cacheFolderPath
)
);
// Agregar método de caché
$stack->push(
new CacheMiddleware(
new GreedyCacheStrategy(
$cache_storage,
600 //el TTL en segundos
)
),
'greedy-cache'
);
// Inicialice el cliente con la opción de controlador y devuélvalo
return new Client(['handler' => $stack]);
}
}
Recuerde que tiene acceso con esta API al valor de las (hasta la fecha de este artículo) 1010 Crypto monedas en el mercado, así que no olvide echar un vistazo a la página de inicio de CoinMarketCap aquí .
Que te diviertas ❤️!
Conviertete en un programador más sociable