本文概述
如今有数百种加密货币, 我们生活在它们的投机热潮中。如果你从事这项业务, 则可能想使用免费的CoinMarketAPI来了解任何加密货币的最新信息。
API如何工作?
CoinMarketAPI公开了3个端点。在这种情况下, 我们将仅使用/ ticker端点中的一个来检索有关单个Cryptocurrency的信息。此API以JSON格式从其ID返回Cryptocurrency的信息:
https://api.coinmarketcap.com/v1/ticker/<Currency ID>/
该API允许你使用以下标识符将货币转换为世界上最知名的货币:” AUD”, ” BRL”, ” CAD”, ” CHF”, ” CNY”, ” EUR”, ” GBP”, ” HKD”, ” IDR”, ” INR”, ” JPY”, ” KRW”, ” MXN”, ” RUB”:
https://api.coinmarketcap.com/v1/ticker/<Currency ID>/?convert=EUR
尽管该API是完全免费的, 但是在请求此信息时, 作者施加了一个限制, 你可能希望应用该限制:
- 请将请求数量限制为每分钟不超过10个(请参阅步骤3)。
API的端点每5分钟更新一次。
重要
在本文中, 我们将向你介绍如何使用普通的Guzzle http客户端和应有的缓存的一个客户端请求货币信息。
1.安装GuzzleHttpClient
Guzzle是一个PHP HTTP客户端, 可以轻松发送HTTP请求, 并且可以轻松地与Web服务集成。它具有一个非常简单的界面, 用于构建查询字符串, POST请求, 流式传输大型上传文件, 流式传输大型下载文件, 使用HTTP cookie, 上传JSON数据等等。
要通过PHP向API发出请求, 你将需要此库。你可以使用以下composer命令安装它:
composer require require guzzlehttp/guzzle
或者, 修改composer.json文件并手动添加依赖项:
{
"require": {
"guzzlehttp/guzzle": "^6.3", }, }
最后使用composer install安装它们。有关此库的更多信息, 请访问Github上的官方存储库。
2.请求有关加密货币的信息
本教程的重点是关于如何检索有关比特币, 以太坊, 莱特币等加密货币的信息。使用Guzzle客户端, 你将以与浏览器相同的方式发出请求。
你首先要做的是创建Guzzle Client实例。客户端有一个方法, 即request, 它希望将请求的类型作为请求的URL, 并将其作为第二个参数。在这种情况下, 第一个参数将是GET格式, 而第二个参数将使用CoinMarketCap API的URL(带有所需的加密货币的ID, 以及可选的货币转换)。请求完成后, 你可以使用结果的getBody方法检索响应主体, 在这种情况下, 该结果将是JSON格式的纯字符串, 因此请确保使用json_decode将其转换为数组。生成的数组将包含API提供的有关货币的所有信息:
警告
不要在生产中使用以下代码, 这只是向你展示如何使用Guzzle Client访问API。请求没有被缓存!
仅在本地环境(开发环境)中使用此功能来第一次测试库。
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// Important: Include the GuzzleClient
use GuzzleHttp\Client;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
// 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 ...
// Send the information of the currencies to a Twig view
return $this->render("default/index.html.twig", [
"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;
}
}
此时, 你可以请求有关两种所需货币(即比特币和以太坊)的信息。如你在索引操作中所看到的, 我们正在返回一个Twig文件, 其中包含以下代码:
{# default/index.html.twig #}
{% extends "base.html.twig" %}
{% block body -%}
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 #}
{{dump(bitcoin)}}
{{dump(ethereum)}}
{% endblock %}
因此, 如果你访问控制器的索引路由, 则Twig将输出以下HTML内容:
但是, 这种情况不会持续太久。如果你一直在不使用缓存的情况下进行请求, 那么CoinMarketCap的API会警告你你发出了太多请求, 因此你需要为请求实现一个缓存管理器。
3.实现一些缓存系统
你将需要为Guzzle Client实现一个缓存管理器, 因为如前所述, 该API是完全免费的, 并且我们不会滥用它(此外, 由于你可能会提出许多请求, 因此你将获得例外不会实现缓存” 429个请求太多”)。
缓存管理器需要由你以所需的方式实现。对于可能不知道如何处理任何缓存的懒惰开发人员, 我们将展示一个使用文件系统缓存的示例。为此, 你将需要安装2个额外的库来处理缓存, 我们正在谈论Symfony的缓存组件和Guzzle缓存中间件。通过运行以下命令, 使用composer安装库:
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
安装后, 你将可以在自己的控制器中使用它们的类。通过使用我们将使用文件系统而不是普通客户端来实现的Guzzle缓存客户端, 新文件夹将出现在symfony项目的缓存目录中(在本例中为/ var / cache / GuzzleFileCache)。不要忘记给予适当的写入文件夹的权限。
该示例创建一个新方法, 即getGuzzleFileCachedClient。此方法应为私有方法, 并返回Guzzle客户端的新实例(用于请求有关货币的信息), 但是使用使用Symfony缓存组件和Guzzle缓存中间件的缓存实现。你可以自由地从客户端实施一项服务, 以保持控制器的清洁, 但如果仅进行测试, 则可以更轻松, 更快地在控制器中进行安装。如API所述, 理想的缓存时间为10分钟(600秒)。控制器中的其余代码将保持不变, 但不要创建新的客户端, 而使用缓存的客户端:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// 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
{
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
// 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 ...
// Send the information of the currencies to a Twig view
return $this->render("default/index.html.twig", [
"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.
*
*
* @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 Custom Cached Guzzle Client
$client = $this->getGuzzleFileCachedClient();
// 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;
}
/**
* Returns a GuzzleClient that uses a cache manager, so you will use the API without any problem and
* request many times as you want.
*
* The cache last 10 minutes as recommended in the API.
*/
private function getGuzzleFileCachedClient(){
// Create a HandlerStack
$stack = HandlerStack::create();
// 10 minutes to keep the cache
$TTL = 600;
// Retrieve the cache folder path of your Symfony Project
$cacheFolderPath = $this->get('kernel')->getRootDir() . '/../var/cache';
// Instantiate the cache storage: a PSR-6 file system cache with
// a default lifetime of 10 minutes (60 seconds).
$cache_storage = new Psr6CacheStorage(
new FilesystemAdapter(
// Create Folder GuzzleFileCache inside the providen cache folder path
'GuzzleFileCache', $TTL, $cacheFolderPath
)
);
// Add Cache Method
$stack->push(
new CacheMiddleware(
new GreedyCacheStrategy(
$cache_storage, 600 // the TTL in seconds
)
), 'greedy-cache'
);
// Initialize the client with the handler option and return it
return new Client(['handler' => $stack]);
}
}
请记住, 你可以使用此API来访问市场上(到本文为止)1010种加密货币的价值, 所以请不要忘记在此处浏览CoinMarketCap的主页。
编码愉快!
评论前必须登录!
注册