😎

「actix-web」入門#1 rustのwebフレーム「actix-web」とは

2022/05/22に公開

色々調べてみたが、現時点でrustのwebフレームは「actix-web」が有名らしいので、「Hello World!」してみることにした。

以下サイトでは、total download数のデータをもとにランキングしていたので参照されたし(^^♪
https://kerkour.com/rust-web-framework-2022

ベンチマークのコンテストでも良い結果を残しているようです。
https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune

PCの環境は以下です。
Windows11
rustup 1.24.3
vscode 1.67.1

とりあえず、実装例を確認してみたら、多すぎて迷うレベルであるんだが( ゚д゚)
https://github.com/actix/examples

てか、ダウンロード数1位だけあってコミュニティが熱い

とりあえず、「examples」にある「basics」をvscodeで開いて「cargo run」してみるhttps://github.com/actix/examples/tree/master/basics/basics

ブラウザで開いてみるとこんな感じ

ちなみにシンプルにルート
http://localhost:8080/
を開くとリダイレクトして、
http://localhost:8080/static/welcome.html
を開いてくれる。

知らん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を試してみる。
http://localhost:8080/user/test

http://localhost:8080/async-body/test

6つ目の関数は言わずもがなmain関数
個人的に気に入ったのが以下の「.service」をつなげて、各URLに対してのレスポンス指定が並ぶこの感じ… 好きだ

次回以降、リクエストボディとクエリパラメータ、CORSとかとかを確認していこうと思う。

Discussion