A Rust Client using Reqwest and dotenv #rust
extern crate dotenv;
extern crate hyper;
use http::header::{HeaderName, HeaderValue};
use reqwest::{Client, Method, Url};
fn get_env_vars() -> (HeaderName, HeaderValue, Url) {
// use dotenv to pull the values from .env
let cmc_api_key = dotenv::var("CMC_API_KEY").expect("CMC_API_KEY not found");
let cmc_api_endpoint = dotenv::var("CMC_API_ENDPOINT").expect("CMC_API_ENDPOINT not found");
let cmc_header_name = dotenv::var("CMC_HEADER_NAME").expect("CMC_HEADER_NAME not found");
// parse and unwrap the values
let header_name = cmc_header_name.parse::<HeaderName>().unwrap();
let header_value = cmc_api_key.parse::<HeaderValue>().unwrap();
let url: Url = cmc_api_endpoint.parse().unwrap();
// return a tuple of the values
(header_name, header_value, url)
}
fn fetch_cmc_data(name: HeaderName, value: HeaderValue, url: Url) -> reqwest::Response {
let client = Client::new();
let request = client
.request(Method::GET, url)
.header(name, value)
.build()
.unwrap();
client.execute(request).unwrap()
}
fn main() {
let (header_name, header_value, url) = get_env_vars();
let mut response = fetch_cmc_data(header_name, header_value, url);
println!("{:?}", response.text());
}
This is a Rust client using the libraries reqwest
and dotenv
. It calls an API endpoint at coinmarketcap.com and returns a list of cryptocurrencies, the first 60+ lines are found at the bottom of this post.
fn main()
, a tuple of the header_name
, header_value
, and url
are returned from get_env_vars()
get_env_vars()
pulls the values from a .env
file in the same directory
CMC_API_KEY
- a coinmarketcap.com API key. Get yours at: {link here}CMC_API_ENDPOINT
- https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latestCMC_HEADER_NAME
- which is "X-CMC_PRO_API_KEY"
fn fetch_cmc_data()
, which then returns reqwest::Response
into mut response
.
reqwest::Client
is instantiated firstreqwest::RequestBuilder
receives the url
in request()
, and the header name and value are passed into header()
.build()
and .unwrap()
are called immediately to create a reqwest::Request
client
now executes the request
, and calls unwrap()
, but you should handle a client error heretext()
output from mut response
is fed into a printing function. Boom!This is the first part of the response from the above client request:
{
"status": {
"timestamp": "2019-02-16T08: 28: 15.822Z",
"error_code": 0,
"error_message": null,
"elapsed": 14,
"credit_count": 1
},
"data": [
{
"id": 1,
"name": "Bitcoin",
"symbol": "BTC",
"slug": "bitcoin",
"circulating_supply": 17540550,
"total_supply": 17540550,
"max_supply": 21000000,
"date_added": "2013-04-28T00: 00: 00.000Z",
"num_market_pairs": 6653,
"tags": [
"mineable"
],
"platform": null,
"cmc_rank": 1,
"last_updated": "2019-02-16T08: 27: 28.000Z",
"quote": {
"USD": {
"price": 3635.49176252,
"volume_24h": 6060386037.82371,
"percent_change_1h": 0.0488409,
"percent_change_24h": 0.14031,
"percent_change_7d": -0.810947,
"market_cap": 63768525035.07019,
"last_updated": "2019-02-16T08: 27: 28.000Z"
}
}
},
{
"id": 1027,
"name": "Ethereum",
"symbol": "ETH",
"slug": "ethereum",
"circulating_supply": 104879559.8741,
"total_supply": 104879559.8741,
"max_supply": null,
"date_added": "2015-08-07T00: 00: 00.000Z",
"num_market_pairs": 4759,
"tags": [
"mineable"
],
"platform": null,
"cmc_rank": 2,
"last_updated": "2019-02-16T08: 27: 19.000Z",
"quote": {
"USD": {
"price": 123.164946188,
"volume_24h": 2964473039.45236,
"percent_change_1h": 0.0820388,
"percent_change_24h": 0.194405,
"percent_change_7d": 3.483,
"market_cap": 12917485348.11465,
"last_updated": "2019-02-16T08: 27: 19.000Z"
}
}
},
...