🐥
reqwest を使って非同期処理中に外部APIを実行する
はじめに
本記事は、前回執筆した、[同期処理]Rust のコードで外部APIを実行するの別編です。
ほとんどの内容は重複しますが、Rust の非同期ランタイムで動作する tokio
というクレートを使って、非同期処理内で外部APIを実行する流れを執筆していきます。
非同期処理でAPIを実行する
前回の記事同様に、公開されているAPIサーバーを利用させていただこうと思います。
jsonplaceholder
を使ってAPIをコールしていきたいと思います。
事前準備
APIの実行のため、前述の reqwest
クレートと、
API実行時、JSON の操作をおこなうため、serde
、serde_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
クレートを利用されることをお勧めします。
みてもらえる通り、とても簡単に実装することができますので、ほとんどドキュメントいらずで実装できちゃうのが良いですね。
では!
Discussion