Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

リクエストを行う

HTTP GET リクエストを行う

reqwest-badge cat-net-badge

指定された URL を解析し、同期的な HTTP GET リクエストを reqwest::blocking::get で実行します。取得した reqwest::blocking::Response のステータスとヘッダーを表示します。HTTP レスポンスボディを、確保された Stringread_to_string を使って読み込みます。

use anyhow::Result;
use std::io::Read;

fn main() -> Result<()> {
    let mut res = reqwest::blocking::get("http://httpbin.org/get")?;
    let mut body = String::new();
    res.read_to_string(&mut body)?;

    println!("Status: {}", res.status());
    println!("Headers:\n{:#?}", res.headers());
    println!("Body:\n{}", body);

    Ok(())
}

非同期

同様のアプローチとして、tokio エグゼキューターを含めて main 関数を非同期にし、同じ情報を取得することもできます。

この例では、tokio::main がエグゼキューターの面倒なセットアップをすべて処理し、 .await までブロックせずに逐次的なコードを実装できるようにします。

reqwest の非同期版である reqwest::getreqwest::Response の両方を使用します。

use anyhow::Result;

#[tokio::main]
async fn main() -> Result<()> {
    let res = reqwest::get("http://httpbin.org/get").await?;
    println!("Status: {}", res.status());
    println!("Headers:\n{:#?}", res.headers());

    let body = res.text().await?;
    println!("Body:\n{}", body);
    Ok(())
}

REST リクエストのカスタムヘッダーと URL パラメーターを設定する

reqwest-badge serde-badge url-badge cat-net-badge

HTTP GET リクエストに対して、標準およびカスタムの HTTP ヘッダーと、 URL パラメーターの両方を設定します。

Url::parse_with_params を使って複雑な URL を構築します。標準 ヘッダー header::USER_AGENTheader::AUTHORIZATION、さらにカスタムの X-Powered-By ヘッダーを RequestBuilder::header を使って設定し、その後 RequestBuilder::send でリクエストを実行します。

リクエスト先の http://httpbin.org/headers は、 簡単に検証できるよう、すべてのリクエストヘッダーを含む JSON の辞書を返します。

use anyhow::Result;
use reqwest::Url;
use reqwest::blocking::Client;
use reqwest::header::{AUTHORIZATION, USER_AGENT};
use serde::Deserialize;
use std::collections::HashMap;

#[derive(Deserialize, Debug)]
pub struct HeadersEcho {
    pub headers: HashMap<String, String>,
}

fn main() -> Result<()> {
    let url = Url::parse_with_params(
        "http://httpbin.org/headers",
        &[("lang", "rust"), ("browser", "servo")],
    )?;

    let response = Client::new()
        .get(url)
        .header(USER_AGENT, "Rust-test-agent")
        .header(AUTHORIZATION, "Bearer my-token")
        .header("X-Powered-By", "Rust")
        .send()?;

    assert_eq!(
        response.url().as_str(),
        "http://httpbin.org/headers?lang=rust&browser=servo"
    );

    let out: HeadersEcho = response.json()?;
    assert_eq!(out.headers["User-Agent"], "Rust-test-agent");
    assert_eq!(out.headers["Authorization"], "Bearer my-token");
    assert_eq!(out.headers["X-Powered-By"], "Rust");

    Ok(())
}