个性化阅读
专注于IT技术分析

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

本文概述

如今有数百种加密货币, 我们生活在它们的投机热潮中。如果你从事这项业务, 则可能想使用免费的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 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;
    }
}

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

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/cache

REM And install the Cache Middleware for Guzzle:
composer require kevinrob/guzzle-cache-middleware

安装后, 你将可以在自己的控制器中使用它们的类。通过使用我们将使用文件系统而不是普通客户端来实现的Guzzle缓存客户端, 新文件夹将出现在laravel项目的缓存目录中(在本例中为/ bootstrap / GuzzleFileCache)。不要忘记给予适当的写入文件夹的权限。

该示例创建一个新方法, 即getGuzzleFileCachedClient。此方法应该是私有的, 并返回Guzzle客户端的新实例(用于请求有关货币的信息), 但是使用使用Symfony缓存组件和Guzzle缓存中间件的缓存实现。你可以自由地从客户端实施一项服务, 以保持控制器的清洁, 但如果仅进行测试, 则可以更轻松, 更快地在控制器中进行安装。如API所述, 理想的缓存时间为10分钟(600秒)。控制器中的其余代码将保持不变, 但不要创建新的客户端, 而使用缓存的客户端:

<?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()
    {
        // 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 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 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 it
        return new Client(['handler' => $stack]);
    }
}

请记住, 你可以使用此API来访问市场上(到本文为止)1010种加密货币的价值, 所以请不要忘记在此处浏览CoinMarketCap的主页。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Laravel中检索信息和任何加密货币(比特币,以太坊)的值

评论 抢沙发

评论前必须登录!