「actix-web」入門#1 rustのwebフレーム「actix-web」とは
色々調べてみたが、現時点でrustのwebフレームは「actix-web」が有名らしいので、「Hello World!」してみることにした。
以下サイトでは、total download数のデータをもとにランキングしていたので参照されたし(^^♪
ベンチマークのコンテストでも良い結果を残しているようです。
PCの環境は以下です。
Windows11
rustup 1.24.3
vscode 1.67.1
とりあえず、実装例を確認してみたら、多すぎて迷うレベルであるんだが( ゚д゚)
てか、ダウンロード数1位だけあってコミュニティが熱い
とりあえず、「examples」にある「basics」をvscodeで開いて「cargo run」してみるhttps://github.com/actix/examples/tree/master/basics/basics
ブラウザで開いてみるとこんな感じ
ちなみにシンプルにルート
を開くとリダイレクトして、 を開いてくれる。知らんURL打つとこんな感じ
コンソール上は以下のログが出てます。
[2022-05-19T13:34:30Z INFO basics] starting HTTP server at http://localhost:8080[2022-05-19T13:34:30Z INFO actix_server::builder] Starting 2 workersf,image/webp,/;q=0.8""connection": "keep-alive""host": "localhost:8080"
[2022-05-19T13:37:56Z INFO actix_web::middleware::logger] 127.0.0.1 "GET / HTTP/1.1" 302 20 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0" 0.003190[2022-05-19T13:37:56Z INFO actix_web::middleware::logger] 127.0.0.1 "GET /static/welcome.html HTTP/1.1" 200 191 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0" 0.002096
流石にキッチリ作りこまれてる
次は、ソースを見ていく
フォルダ構成はこんな感じ
basicsだからシンプル
ざっくり関数確認
/// favicon handler
#[get("/favicon")]
async fn favicon() -> Result<impl Responder> {
...
}
/// simple index handler
#[get("/welcome")]
async fn welcome(req: HttpRequest, session: Session) -> Result<HttpResponse> {
...
}
async fn default_handler(req_method: Method) -> Result<impl Responder> {
...
}
/// response body
async fn response_body(path: web::Path<String>) -> HttpResponse {
...
}
/// handler with path parameters like `/user/{name}/`
async fn with_param(req: HttpRequest, path: web::Path<(String,)>) -> HttpResponse {
...
}
#[actix_web::main]
async fn main() -> io::Result<()> {
...
}
どうやら上2つの関数はアトリビュートでリクエストパスを指定しているらしい。それぞれ「favicon」「welcome」を指定してる。
で、3つ目の関数はリクエストパスが「favicon」「welcome」以外って感じ
4つ目の関数「response_body」はそのままサーバからの返答
5つ目の関数はURLのパラメータ管理らしい
引数に「/user/{name}」とか「/async-body/{name}」が渡されてる
ということで、上記URLを試してみる。
6つ目の関数は言わずもがなmain関数
個人的に気に入ったのが以下の「.service」をつなげて、各URLに対してのレスポンス指定が並ぶこの感じ… 好きだ
次回以降、リクエストボディとクエリパラメータ、CORSとかとかを確認していこうと思う。
Discussion