75
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

古い記事に騙されないで!hyperじゃなくreqwestを使ってください

Last updated at Posted at 2017-12-14

ちょっと煽ってみました
誰も書いていなかったのでreqwestについて書きます。

TL;DR

HTTP系crateのデファクトスタンダードであったhyper0.11.0からtokiofuturesを採用した複雑なAPIに変わりました。
simpleでstableなHTTP clientが使いたければhyperの作者でもあるseanmonstar氏のreqwestを使うのがいいです。
もちろん、reqwestにデフォルトでついてくる機能がいらない場合や、高次元なcrateを自作したい場合はhyperを使うのが正しいです。

現在のhyper

clientの公式exampleがここここに載っています。
かなり単純な形でも以下のようになりますね。

extern crate futures;
extern crate hyper;
extern crate tokio_core;

use std::io::{self, Write};
use futures::{Future, Stream};
use hyper::Client;
use tokio_core::reactor::Core;

let mut core = Core::new().unwrap();
let client = Client::new(&core.handle());

let uri = "http://httpbin.org/ip".parse().unwrap();
let work = client.get(uri).and_then(|res| {
    println!("Response: {}", res.status());

    res.body().for_each(|chunk| {
        io::stdout()
            .write_all(&chunk)
            .map_err(From::from)
    })
});
core.run(work).unwrap();

これだとGET Requestを送って結果を書き出すだけにしてはoverkillな気がします。

  • extern crateが3つ必要
  • この場合Asynchronousである必要がない
  • リダイレクトを追うとか、Cookie、TLSなどを扱うとしたらもっと複雑になる

Reqwest

そこで、reqwestです。

# Cargo.toml
[depenencies]
reqwest = "*"
extern crate reqwest;
use std::io;

let mut res = reqwest::get("http://httpbin.org/ip").unwrap();
res.copy_to(&mut io::stdout()).unwrap();

文字数がかなり減りました。

POST form data

let client = reqwest::Client::new();
let res = client.post("url")
    .form(&[ ("foo", "bar"), ("baz", "quux") ])
    .send().unwrap();

JSONで

form()json()で置き換えればできます。Serializeをimplしていればなんでもokです。

背景

なんでこうなったの?についてはseanmonstarさん本人のブログ記事、Introducing Reqwestが詳しい。
要約すると、

  • リダイレクトの処理、Cookie,コネクションプーリング、JSONペイロードなど、ほとんどのユーザがデフォルトとして望むものをまとめたライブラリが欲しかった
  • hyperがnon-blocking I/Oを採用するので、blockingでもいいほとんどの人はこっちを使ってほしい(AsyncClientのようなものも後からreqwestに実装するつもり)
  • 同時にhyperのAPIががっつり変わるので、その前にstableなものを提供するという位置づけ

redditで本人がまとめていますが、他の言語と比較するとこのような感じになります

Rust nodejs python Java
hyper http urllib2 URLConnection
reqwest request requests OkHttpなど

まとめ

初心者がhyperでつまずかないように書きました。Event loopやfutureについて知るのも大事ですが、まずはreqwestから入って自由にリクエストを投げまくってほしい

75
34
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
75
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?