axum0.4の主な変更点
この記事はRust Advent Calendar 2021の記事です。
tokioがメンテナンスしている新しいWebフレームワーク axum のバージョン0.4が2021/12/6にリリースされたので主な変更点をご紹介します。
0.3は破壊的な変更が多かったですが、0.4ではリファクタが中心のようです。
axum-coreクレートの提供
axumが提供する FromRequest<B>
や IntoResponse<B>
トレイトは拡張性が高く、以前からこれを利用して様々なカスタムリクエストやカスタムレスポンスを実装することができます。
しかし、このトレイトはaxumに実装されているため、これらのトレイトを利用するクレートはこれとは無関係なaxumのバージョンアップに対してもbump upする必要がありました。
axum 0.4ではaxum-coreクレートに分離して提供することで、axum自体のバージョンアップに影響されない作りになります。
これに伴い、axum-coreが axum::body::Body
( hyper::body::Body
) に依存することを避けるために、FromRequest<B>
や RequestParts<B>
で与えられていたデフォルト型パラメータ <B = axum::body::Body>
が削除され、明示的な型指定が必要になっています。
MethodRouterのリファクタ
0.3ではRouterに渡す具体的な処理として handler と service を個別に取り扱う必要があり、MethodRouterもそれぞれのものがありましたが、0.4ではこれらを統一的に扱えるようになりました。
そのため、
-
routing::handler_method_router
とrouting::service_method_router
にそれぞれに用意されていたget
やpost
はaxum::router
モジュールの中に定義されているget
(handler) やpost_service
(service) といった関数を利用する- これに伴い
routing::handler_method_router
とrouting::service_method_router
は廃止
- これに伴い
- handlerとserviceをまとめてルーティングする
Router::new().route("/", get(handler).post_service(service))
-
merge
,layer
,route_layer
,fallback
を統一的に扱う - 複数routeのサポート
Router::new().route("/", get(handler)).route("/", post_service(service))
といったことが可能になっています。
なお、この対応のモチベーションは
[https://github.com/tokio-rs/axum/issues/451:title]
の解決にあるとのことです。
Handler<B, T>
のリファクタ
リクエストの型は基本的に axum::body::Body
であるため、 Handler
で、常に型パラメータ B
に対しこの axum::body::Body
を与えるのが少し冗長です。
そのため、0.4ではデフォルトの型が与えられるようになりました。そのため、型パラメータの順序が入れ替えられています。
- pub trait Handler<B, T>: Clone + Send + Sized + 'static {
+ pub trait Handler<T, B = Body>: Clone + Send + Sized + 'static {
Discussion