如何在Laravel中检索信息和任何加密货币(比特币,以太坊)的值

本文概述

  • API如何工作?
  • 1.安装GuzzleHttpClient
  • 2.请求有关加密货币的信息
  • 3.实现一些缓存系统
如今有数百种加密货币, 我们生活在它们的投机热潮中。如果你从事这项业务, 则可能想使用免费的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

【如何在Laravel中检索信息和任何加密货币(比特币,以太坊)的值】或者, 修改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 App\Http\Controllers; use Illuminate\Http\Request; // Important: Include the GuzzleClientuse 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 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; }}

此时, 你可以请求有关两种所需货币(即比特币和以太坊)的信息。如你在索引操作中看到的, 我们将返回一个刀片模板, 即默认模板, 其中包含以下结构:
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)}}

因此, 如果你访问控制器的索引路由, 你将获得以下HTML内容:
如何在Laravel中检索信息和任何加密货币(比特币,以太坊)的值

文章图片
但是, 这种情况不会持续太久。如果你一直在不使用缓存的情况下进行请求, 那么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缓存客户端, 新文件夹将出现在laravel项目的缓存目录中(在本例中为/ bootstrap / GuzzleFileCache)。不要忘记给予适当的写入文件夹的权限。
该示例创建一个新方法, 即getGuzzleFileCachedClient。此方法应该是私有的, 并返回Guzzle客户端的新实例(用于请求有关货币的信息), 但是使用使用Symfony缓存组件和Guzzle缓存中间件的缓存实现。你可以自由地从客户端实施一项服务, 以保持控制器的清洁, 但如果仅进行测试, 则可以更轻松, 更快地在控制器中进行安装。如API所述, 理想的缓存时间为10分钟(600秒)。控制器中的其余代码将保持不变, 但不要创建新的客户端, 而使用缓存的客户端:
< ?phpnamespace App\Http\Controllers; use Illuminate\Http\Request; // 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{/*** 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.* ** @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 Laravel Project$cacheFolderPath = base_path() . "/bootstrap"; // 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的主页。
编码愉快!

    推荐阅读