Axum のお試しとエラーハンドリング
こんにちは、 @kz_morita です。
今日は、Rust の Web フレームワークの、Axum を使ってみたのメモです。
Axum を使ってみる https://github.com/tokio-rs/axum 基本形は以下のような形です。
useaxum::routing::get;useaxum::Router;#[tokio::main]asyncfn main(){letapp=Router::new().route("/",get(index));letaddr=SocketAddr::from(([127,0,0,1],3000));println!("listening on {}",addr);axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap();}asyncfn index()-> &'static str {"OK"}他の Web フレームワークと大体使い方一緒なので特に迷うことはなさそうですが一点だけ注意があります。
GitHub の main ブランチの README を見て、同じコードを書くと動きません。
以下のようなコードが書かれていますが、最新版の axum にまだこのコードが入っていないためです。
axum::serve(listener,app).await.unwrap();そのため、tag で特定のブランチに移動してから README などを見ることをお勧めします。
上記を実行すると、localhost:3000 で "OK" と返すだけの API が作れます。
Axum のエラーハンドリング Axum で API のエラーハンドリングをする方法がよくわからなかったのですが、以下のような方法がとりあえずよさそうかなと思います。
/search エンドポイントがエラーハンドリングするとします。
Router の定義は通常通りで何も変更ありません。
letapp=Router::new().route("/",get(index)).route("/search",get(search));handler は以下のように定義します。
asyncfn search()-> Result<Json<ItemResponse>,AppError>{letresp=search_item().await?;Ok(Json(resp))}asyncfn search_item()-> anyhow::Result<SearchResult>{// SearchResult or anyhow::Error を返す処理 }AppError 型は独自定義した型になります。
struct AppError(anyhow::Error);// anyhow::Error => AppError への型変換 impl<E>From<E>forAppErrorwhereE: Into<anyhow::Error>,{fn from(err: E)-> Self{Self(err.