RustでHTTPクライアントを作る|reqwestの使い方

先生

RustでHTTPリクエストを自由自在に操ろう!reqwestライブラリでWebの世界へ飛び込もう!

RustでHTTPクライアントを実装する:reqwestの導入

RustでHTTPクライアントを実装する方法を解説します。Rustのエコシステムには、HTTPリクエストを簡単に扱えるreqwestという素晴らしいライブラリがあります。この記事では、reqwestの基本的な使い方から、より高度なテクニックまでを網羅的に説明します。

reqwestは、シンプルで強力なAPIを提供し、非同期処理もサポートしているため、高性能なアプリケーションを開発できます。Web APIとの連携やスクレイピングなど、様々な用途で活用できるでしょう。

まずは、reqwestをプロジェクトに導入しましょう。Cargo.tomlファイルに以下の依存関係を追加します。


[dependencies]
reqwest = { version = "0.11", features = ["json", "blocking"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

ここでは、JSONの処理と、同期処理(blocking feature)を使用するための設定も行っています。非同期処理を行う場合は、tokioを追加してください。また、データのシリアライズ/デシリアライズにserdeserde_jsonを使用します。

依存関係を追加したら、cargo buildを実行してライブラリをダウンロードします。

基本的なGETリクエストの送信

reqwestを使った最もシンプルなGETリクエストの送信方法を見てみましょう。


use reqwest::blocking::Client;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let resp = client.get("https://www.example.com")
        .send()?;
    println!("Status: {}", resp.status());
    let body = resp.text()?;
    println!("Body:\n{}", body);
    Ok(())
}

このコードでは、Client::new()でクライアントを作成し、get()メソッドでリクエストを送信しています。send()メソッドはResult型を返すため、エラーハンドリングが必要です。レスポンスのステータスコードとボディを表示しています。

非同期処理を使用する場合は以下のようになります。


use reqwest;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::get("https://www.example.com")
        .await?;
    println!("Status: {}", resp.status());
    let body = resp.text().await?;
    println!("Body:\n{}", body);
    Ok(())
}

POSTリクエストとJSONデータの送信

POSTリクエストを送信し、JSONデータを送信する方法を説明します。


use reqwest::blocking::Client;
use serde_json::json;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let data = json!({ "name": "John Doe", "age": 43 });
    let resp = client.post("https://httpbin.org/post")
        .json(&data)
        .send()?;
    println!("Status: {}", resp.status());
    let body = resp.text()?;
    println!("Body:\n{}", body);
    Ok(())
}

ここでは、json!マクロを使ってJSONデータを作成し、json()メソッドでリクエストボディに設定しています。httpbin.org/postは、POSTリクエストの内容を返す便利なエンドポイントです。

非同期処理を使用する場合は以下のようになります。


use reqwest;
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let data = json!({ "name": "John Doe", "age": 43 });
    let resp = reqwest::Client::new().post("https://httpbin.org/post")
        .json(&data)
        .send()
        .await?;
    println!("Status: {}", resp.status());
    let body = resp.text().await?;
    println!("Body:\n{}", body);
    Ok(())
}

エラーハンドリング

reqwestを使用する際には、エラーハンドリングが重要です。ネットワークエラーやサーバーからのエラーレスポンスなど、様々な状況に対応する必要があります。


use reqwest::blocking::Client;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let resp = client.get("https://www.example.com/nonexistent")
        .send(); 
    match resp {
        Ok(response) => {
            if response.status().is_success() {
                println!("Success!");
            } else {
                println!("Request failed with status: {}", response.status());
            }
        }
        Err(err) => {
            eprintln!("Error: {}", err);
        }
    }
    Ok(())
}

この例では、send()メソッドの結果をmatch式で処理し、エラーが発生した場合と、ステータスコードが成功でない場合にエラーメッセージを表示しています。

非同期処理の場合も同様に、awaitで待機した結果をmatch式で処理します。

参考リンク

まとめ

reqwestを使うことで、Rustで簡単にHTTPクライアントを実装できます。GETリクエスト、POSTリクエスト、JSONデータの送受信、エラーハンドリングなど、基本的な操作をマスターすれば、様々なWeb APIとの連携が可能になります。非同期処理もサポートされているため、高性能なアプリケーション開発にも適しています。ぜひreqwestを活用して、RustでのWeb開発をさらに楽しんでください。