🐥

reqwest を使って非同期処理中に外部APIを実行する

2024/07/21に公開

はじめに

本記事は、前回執筆した、[同期処理]Rust のコードで外部APIを実行するの別編です。

ほとんどの内容は重複しますが、Rust の非同期ランタイムで動作する tokioというクレートを使って、非同期処理内で外部APIを実行する流れを執筆していきます。
https://zenn.dev/collabostyle/articles/054c0361c86f07

非同期処理でAPIを実行する

前回の記事同様に、公開されているAPIサーバーを利用させていただこうと思います。
jsonplaceholderを使ってAPIをコールしていきたいと思います。

https://jsonplaceholder.typicode.com

事前準備

APIの実行のため、前述の reqwestクレートと、
API実行時、JSON の操作をおこなうため、serdeserde_jsonクレートを追加しておきます。
さらに、今回は非同期での外部APIの実行ということで、tokioを追加します。

Cargo.toml
[dependencies]
reqwest = { version = "0.12.4", features = ["json"] }
serde = "1.0.203"
serde_json = "1.0.117"
tokio = { version = "1.38.1", features = ["full"] }
コマンドラインの場合

以下コマンドを実行します。

cargo add reqwest --features json
cargo add tokio --features full
cargo add serde
cargo add serde_json

POST

以下のようなサンプルコードを作成しました。
clientに対して、メソッドや JSON を入れることができることがわかると思います。
当然ですが、非同期関数内での外部APIのコールのため awaitが必須になっています。

use reqwest::{Client, Response};
use serde_json::json;

#[tokio::main]
async fn main() {
    // クライアントの生成
    let client = Client::new();

    // create_todo の呼び出し
    let res = create_todo(client).await;

    // 出力
    println!("{:?}", res)
}

async fn create_todo(client: Client) -> Result<Response, reqwest::Error> {
    let url = "https://jsonplaceholder.typicode.com/todos";

    let body = json!({
        "title": "foo",
        "body": "bar",
        "userId": 1
    });

    // 送信
    client.post(url).json(&body).send().await
}

GET

以下のようなサンプルコードを作成しました。
POST 時と内容自体はほとんど変わらないことがわかるかと思います。
もし、クエリパラメーターを追加したい場合は query()がありますので、そこに定義するとOKのようです。

use reqwest::{Client, Response};

#[tokio::main]
async fn main() {
    let client = Client::new();

    let res = get_todo(client).await;
    println!("{:?}", res)
}

async fn get_todo(client: Client) -> Result<Response, reqwest::Error> {
    let url = "https://jsonplaceholder.typicode.com/todos/1";

    client.get(url).send().await
}

おわりに

以上です。
外部のAPIクライアントを叩きたい場合、reqwestクレートを利用されることをお勧めします。
みてもらえる通り、とても簡単に実装することができますので、ほとんどドキュメントいらずで実装できちゃうのが良いですね。

では!

コラボスタイル Developers

Discussion