👌

[同期処理]Rust のコードで外部APIを実行する

2024/06/20に公開

はじめに

Rust で外部のAPIをコールする機会はしばしば出てくると思います。
私もこの辺りほとんど知識がないですが、利用する機会が出てきたのでアウトプットします。

APIをコールする手段として、Rustではreqwestというクレートを利用することが一般的なようです。
今回は reqwestを利用した実装方法を書いていきます。
https://docs.rs/reqwest/latest/reqwest/

同期処理でAPIを実行する

同期的にAPIをコールする方法をやっていきます。
jsonplaceholderを使ってAPIをコールしていきたいと思います。

https://jsonplaceholder.typicode.com

事前準備

APIの実行のため、前述の reqwestクレートと、
API実行時、JSON の操作をおこなうため、serdeserde_jsonクレートを追加しておきます。

Cargo.toml
[dependencies]
reqwest = { version = "0.12.4", features = ["blocking", "json"]}
serde = "1.0.203"
serde_json = "1.0.117"

POST

POST時は以下のコードのように実装可能。
reqwestクレートの blocking を利用し、同期的なクライアントを作成し、
クライアントに対して、post メソッドを呼び出します。

main.rs
use reqwest::blocking::Client;
use serde_json::json;

fn main() {
    let client = Client::new();
    let res = create_todo(client).unwrap();
    println!("{:?}", res)
}

fn create_todo(client: Client) -> Result<reqwest::blocking::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()
}

GET

GET時もPOST時とほとんど同じです。
もしクエリパラメータを追加したい場合は、get メソッドの後に query メソッドを呼び出します。

main.rs
use reqwest::blocking::Client;
use serde_json::json;

fn main() {
    let client = Client::new();
    let res = fetch_todo(client).unwrap();
    println!("{:?}", res)
}

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

    client.get(url).send()
}

おわりに

今回は外部APIの実行を reqwest クレートを使った方法を紹介しました。

次の記事では、非同期編としてやっていこうと思います!

では。

コラボスタイル Developers

Discussion