本文概述
- API如何工作?
- 1.安装GuzzleHttpClient
- 2.请求有关加密货币的信息
- 3.实现一些缓存系统
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)。
重要 在本文中, 我们将向你介绍如何使用普通的Guzzle http客户端和应有的缓存的一个客户端请求货币信息。
1.安装GuzzleHttpClient 【如何在Symfony 3中检索信息和任何加密货币(比特币,以太坊)的值】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。请求没有被缓存!
仅在本地环境(开发环境)中使用此功能来第一次测试库。
<
?phpnamespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// Important: Include the GuzzleClientuse 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 viewreturn $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 exceptionif(array_key_exists("error" , $body)){throw $this->
createNotFoundException(sprintf('Currency Information Request Error: $s', $body["error"]));
}// Returns the array with information about the desired currencyreturn $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/cacheREM 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秒)。控制器中的其余代码将保持不变, 但不要创建新的客户端, 而使用缓存的客户端:
<
?phpnamespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// Important: add the required classesuse 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 viewreturn $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 exceptionif(array_key_exists("error" , $body)){throw $this->
createNotFoundException(sprintf('Currency Information Request Error: $s', $body["error"]));
}// Returns the array with information about the desired currencyreturn $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 itreturn new Client(['handler' =>
$stack]);
}}
请记住, 你可以使用此API来访问市场上(到本文为止)1010种加密货币的价值, 所以请不要忘记在此处浏览CoinMarketCap的主页。
编码愉快!
推荐阅读
- 如何在Winforms C#中仅允许数字出现在文本框中
- 如何在Symfony 3中将FWUserBundle与HWIOAuthBundle一起配置和使用(社交登录)
- 如何在C#中从Winforms应用程序打印PDF
- 如何在Symfony 2和3中使用php创建Excel文件
- 如何在Symfony 3中使用PHP在服务器端突出显示代码
- Android - 带有抽屉菜单的活动标题
- 包括web whatsapp自己的网站
- Objective-C Mapview在IPA上崩溃(appstore版本)Xcode 9运行良好[重复]
- Android崩溃日志注释