TL;DR
HTTP クライアントや HTTP サーバを立ち上げる機能を提供する Rust のクレート。公式ドキュメントは、ライブラリやアプリケーションの部品として使う低レベルな HTTP ライブラリだと説明している。
仕組み
HTTP/1 と HTTP/2 に対応し、非同期で動く。クライアントとサーバの両方の API を持つ。http1、http2、client、server などの機能はフィーチャフラグで選んで有効にする。デフォルトでは、どれも有効になっていない。
例
公式ガイドの Hello World サーバでは、Tokio の TcpListener で接続を受け、接続ごとにタスクを起動して http1::Builder で HTTP/1 の接続を処理する。service_fn は、関数からリクエストへの応答方法を表す Service を作る。TokioIo は、Tokio のストリームを hyper の IO トレイトに合わせるためのラッパである。
async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
}
// 接続ごとに
let io = TokioIo::new(stream);
tokio::task::spawn(async move {
if let Err(err) = http1::Builder::new()
.serve_connection(io, service_fn(hello))
.await
{
eprintln!("Error serving connection: {:?}", err);
}
});注意点
公式ドキュメントは hyper を低レベルなライブラリと位置づけ、手軽な HTTP クライアントが欲しいだけなら reqwest を検討するよう勧めている。GitHub の README は、HTTP サーバに迷ったら、hyper の上に作られた axum や warp を検討するよう勧めている。