reqwest使おうとしたけどよくわからん
はじめに
年の瀬にスクレイピングしたくなって Rust 勉強し始めたけれど、直前に reqwest ライブラリに更新が入ったみたいでコピペコーディングが阻まれた。
知っとかないといけなかったこと
- 今回の更新 reqwest 0.10.0 で async/await がデフォルトになった(ので従来のサンプルコードは動かなくなった)。
- Cargo には feature flag(feature toggle) 機能があって、reqwest やら(オフィシャルサンプルで利用している)tokio やらもこれを利用している。
- (async/await を使わない、従来の)blocking 版をどうやって使うのか全然わからなかったけれど、features で明示的に指定する必要があった。
- オフィシャルサンプルを動かすにしてもこれを知っておかないといけなかった。
- tokioを用いる必要があった。
サンプルを動かすには
https://github.com/seanmonstar/reqwest
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let resp: HashMap<String, String> = reqwest::get("https://httpbin.org/ip")
.await?
.json()
.await?;
println!("{:#?}", resp);
Ok(())
}
を動かすためには、 Cargo.toml
の [dependencies]
セクションに次のように書く必要があった。
[dependencies]
reqwest = {version = "0.10.0", features=["json"]}
tokio = {version = "0.2.6", features = ["macros"]}
また、blocking 版
use std::collections::HashMap;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let resp: HashMap<String, String> = reqwest::blocking::get("https://httpbin.org/ip")?
.json()?;
println!("{:#?}", resp);
Ok(())
}
は、
[dependencies]
reqwest = {version = "0.10.0", features=["json","blocking"]}
であった。
ちなみに reqwest の feature flag 一覧は
にある。