さびでウェブAPIをフェッチする方法🦀


このチュートリアルでは、Rubyで非同期的にWeb APIを取得する方法を教えます.このチュートリアルでは、さびの基礎を知っている錆をインストールしている開発者のためのものであり、錆の非同期プログラミングについて学びたいです.インストールされていない場合は、ここでダウンロードできます.https://www.rust-lang.org/tools/install .

私たちは何を建てていますか。


このチュートリアルでは、我々はCLI株式アプリを構築するためにやっている.プログラムを実行し、引数を指定します.例えば、cargo run AAPL アップル株の値段をあげる.我々は完全に無料ですこのプロジェクトのFinnHub APIを使用するつもりです.右に飛び込みましょう!

プロジェクトの設定


新しいRustプロジェクトを作成し、お気に入りのコードエディタで開きましょう.
cargo new stock-cli
cd stock-cli/
プロジェクトは次のようになります.
├── Cargo.toml
└── src
    └── main.rs
依存関係のセクションの下でこれを入力して依存関係をインストールしましょうCargo.toml . あなたCargo.toml 次のようになります.
[package]
name = "stock-cli"
version = "0.1.0"
authors = ["Your Name"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
structopt = "0.3.21"
exitfailure = "0.5.1"
reqwest = { version = "0.11.0", features = ["json"] }
serde = "1.0.119"
serde_json = "1.0.61"
serde_derive = "1.0.119"
tokio = { version = "1.0.2", features = ["full"] }
これらの依存関係がどうなっているか説明します.次に、APIキーが必要です.移動するhttps://finnhub.io/register アカウントを作成します.一度サイン入りしてくださいhttps://finnhub.io/dashboard そして、あなたはAPIキーを見るべきです.このプロジェクトを開いてください.それのように、コーディングに入りましょう!

プロジェクトのコーディング


まず、ユーザが通過する引数を取得しましょう.標準ライブラリのenvモジュールを使用して行うことができます.あなたsrc/main.rs 次のようになります.
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:?}", args);
}
このコードでは、標準ライブラリのenvモジュールをインポートしますargs() 関数を収集し、デバッグ形式で出力する{:?} 値をデバッグする方法).このコマンドを実行すると、cargo run AAPL , を受信します.
["target/debug/stock-cli", "AAPL"]
ご覧のように、我々が興味を持っている値は、ベクトルの第2の要素またはインデックス1のベクトル(Rustは0指数)です.ユーザが引数を入力しないシナリオを扱いましょう.src/main.rs
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    let mut company: String = "AAPL".to_string();

    if args.len() < 2 {
        println!("Since you didn't specify a company symbol, it is defaulted to AAPL.");
    } else {
        company = args[1].clone();
    }

    println!("{:?}", company);
}
ご覧のように、ユーザーが会社のシンボルを入力しない場合、デフォルトはaaplです.さもなければ、会社は彼らが指定した引数です.引数なしでプログラムを実行すると、まだ動作します.cargo run
Since you didn't specify a company symbol, it has defaulted to AAPL.
"AAPL"
さて、finnhub APIを取得しましょう.使用しているAPIエンドポイントは/quote これは現在の株価といくつかの他の詳細を返します.src/main.rs
use exitfailure::ExitFailure;
use reqwest::Url;
use serde_derive::{Deserialize, Serialize};
use std::env;

#[derive(Serialize, Deserialize, Debug)]
struct CompanyQuote {
    c: f64,
    h: f64,
    l: f64,
    o: f64,
    pc: f64,
    t: i128,
}

impl CompanyQuote {
    async fn get(symbol: &String, api_key: &String) -> Result<Self, ExitFailure> {
        let url = format!(
            "https://finnhub.io/api/v1/quote?symbol={}&token={}",
            symbol, api_key
        );

        let url = Url::parse(&*url)?;
        let res = reqwest::get(url).await?.json::<CompanyQuote>().await?;

        Ok(res)
    }
}

#[tokio::main]
async fn main() -> Result<(), ExitFailure> {
    let api_key = "YOUR API KEY".to_string();
    let args: Vec<String> = env::args().collect();
    let mut symbol: String = "AAPL".to_string();

    if args.len() < 2 {
        println!("Since you didn't specify a company symbol, it has defaulted to AAPL.");
    } else {
        symbol = args[1].clone();
    }

    let res = CompanyQuote::get(&symbol, &api_key).await?;
    println!("{}'s current stock price: {}", symbol, res.c);

    Ok(())
}
「APIキー」をダッシュボードのAPIキーで置き換えるようにしてください.このコードでは、構造体CompanyQuote . の実装でCompanyQuote , 非同期関数get を返します.CompanyQuote またはエラーです.この関数は、会社シンボルとAPIキーをパラメータとして期待します.まず、シンボルとAPIキーを含むURLを書式設定します.次に、URLを解析し、reqwestモジュールを使って取得します.我々は応答を待っているし、JSONにそれを回す.The ? 演算子はunwrap . 最後に、結果の中でOKを返しています.
まず、メイン関数の前に、次のようにします.#[tokio::main] . それは、我々が我々の主な機能で待つことができることを意味します.主な機能の終わりに向かって、我々は会社の引用を得て、パラメータとしてシンボルとAPIキーを渡しています.我々は応答を待ってからprintln! マクロは、現在の株価を出力します.その後、我々はOk すべてが計画通りに行ったと言うこと.
あなたは、何を意味しますか?

非同期/待機


このセクションでは、私はあなたの簡単な概要を与えるasync and await .
async -待機することを許可します
wait -次のコマンドに移動する前に実行するコマンドを待つ
なぜコマンドを実行するのを待つ必要があるのですか?
あなたが想像できるようにWeb APIを取得するいくつかの時間がかかります.データがフェッチされるのを待たずに、レスポンスを持って何かをするならば、結果は将来(データを取得するのを待ちます)であるので、エラーを得るでしょう.また、ここではAsync/Waitを読んでください.

コードの実行


実行してコードを実行しましょうcargo run {the company symbol you want the stock price of} 私はcargo run TSLA ). ご存知のように、この記事を書いている時の株価です!
TSLA's current stock price: 826.16
私はどのようにRustでAPIを取得する方法を学び、Asyncの一般的な理解を持って待ってほしい.その他の錆チュートリアルすぐに来る!最後のコードはgithubです.読書ありがとう!

ヘンリボシリデキン / ストックCLI


あなたの会社の現在の株価を与える単純なCLIアプリ。


ストックCLI


CLIのアプリは、会社の現在の株式を取得する指定された.
のために
View on GitHub
ヘンリー
📰 Newsletter
🐱 GitHub