Actix-Webでwebアプリケーションを作る – Part 2 Hello World!編

rust

はじめに

前回の続きの記事になります。前回の記事ではvscodeのremote – containersでコンテナにログインしたところで終わりました。今回はの記事ではその続きからやっていきます。

プロジェクトの作成

vscodeのターミナル上で操作することとします。

cargo initコマンドでプロジェクトの作成を行います。

/web$ cargo init
     Created binary (application) package

下記のようなディレクトリ構成でファイルが作成されます。

.
├── .gitignore
├── Cargo.toml
└── src
     └── main.rs
fn main() {
    println!("Hello, world!");
}
[package]
name = "web"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Cargo.tomlの項目name=”web”の”web”はカレントディレクトリ名が使われています。

一旦このままでビルドしてみましょう。

/web$ cargo build
   Compiling web v0.1.0 (/web)
    Finished dev [unoptimized + debuginfo] target(s) in 0.59s

./target/debugディレクトリにwebという名前の実行ファイルが作成されているので実行してみます。Hello, world!と表示されていればOKです。

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/web`
Hello, world!

./target/debug/webを直接起動することも出来ますがcargo runコマンドを用いたほうが便利なのでそちらを利用しましょう。

/web$ ./target/debug/web
Hello, world!

Actix-Webの導入

それではcreates.ioのActix-Webのページを見てみましょう。ページの右側のInstallに書いてある記述をコピーしてきます。それをCargo.toml[dependencies]の下に貼り付けます。このプロジェクトで利用するクレート名とバージョンの設定をしています。

[dependencies]
+ actix-web = "4.1.0"

main.rsファイルを以下のように修正します。

use actix_web::{get, web, App, HttpServer, Responder};

#[get("/hello/{name}")]
async fn greet(name: web::Path<String>) -> impl Responder {
    format!("Hello {name}!")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new().service(greet)
    })
    .bind(("0.0.0.0", 8080))?
    .run()
    .await
}

cargo runコマンドでコンパル&実行します。

$ cargo run
   Compiling pin-project-lite v0.2.9
   Compiling once_cell v1.13.0
   Compiling scopeguard v1.1.0
   Compiling smallvec v1.9.0
   Compiling pin-utils v0.1.0
   Compiling futures-sink v0.3.21
   Compiling percent-encoding v2.1.0
   Compiling matches v0.1.9
   Compiling local-waker v0.1.3
   Compiling alloc-no-stdlib v2.0.3
   Compiling tinyvec_macros v0.1.0
   Compiling ppv-lite86 v0.2.16
   Compiling hashbrown v0.12.3
   Compiling adler v1.0.2
   Compiling unicode-bidi v0.3.8
   Compiling bitflags v1.3.2
   Compiling num_threads v0.1.6
   Compiling slab v0.4.6
   Compiling ryu v1.0.10
   Compiling cpufeatures v0.2.2
   Compiling language-tags v0.3.2
   Compiling httpdate v1.0.2
   Compiling mime v0.3.16
   Compiling base64 v0.13.0
   Compiling actix-utils v3.0.0
   Compiling tinyvec v1.6.0
   Compiling alloc-stdlib v0.2.1
   Compiling form_urlencoded v1.0.1
   Compiling tracing-core v0.1.28
   Compiling miniz_oxide v0.5.3
   Compiling futures-core v0.3.21
   Compiling typenum v1.15.0
   Compiling futures-task v0.3.21
   Compiling crc32fast v1.3.2
   Compiling httparse v1.7.1
   Compiling encoding_rs v0.8.31
   Compiling brotli-decompressor v2.3.2
   Compiling parking_lot_core v0.9.3
   Compiling socket2 v0.4.4
   Compiling signal-hook-registry v1.4.0
   Compiling getrandom v0.2.7
   Compiling num_cpus v1.13.1
   Compiling time v0.3.11
   Compiling mio v0.8.4
   Compiling lock_api v0.4.7
   Compiling actix-service v2.0.2
   Compiling indexmap v1.9.1
   Compiling serde_json v1.0.82
   Compiling serde_urlencoded v0.7.1
   Compiling futures-util v0.3.21
   Compiling tracing v0.1.35
   Compiling flate2 v1.0.24
   Compiling unicode-normalization v0.1.21
   Compiling rand_core v0.6.3
   Compiling ahash v0.7.6
   Compiling generic-array v0.14.5
   Compiling parking_lot v0.12.1
   Compiling brotli v3.3.4
   Compiling rand_chacha v0.3.1
   Compiling zstd-sys v2.0.1+zstd.1.5.2
   Compiling tokio v1.20.0
   Compiling idna v0.2.3
   Compiling cookie v0.16.0
   Compiling zstd-safe v5.0.2+zstd.1.5.2
   Compiling rand v0.8.5
   Compiling block-buffer v0.10.2
   Compiling crypto-common v0.1.6
   Compiling zstd v0.11.2+zstd.1.5.2
   Compiling url v2.2.2
   Compiling digest v0.10.3
   Compiling sha1 v0.10.1
   Compiling local-channel v0.1.3
   Compiling tokio-util v0.7.3
   Compiling actix-rt v2.7.0
   Compiling actix-server v2.1.1
   Compiling actix-codec v0.5.0
   Compiling h2 v0.3.13
   Compiling actix-http v3.2.1
   Compiling actix-web v4.1.0
   Compiling web v0.1.0 (/web)
    Finished dev [unoptimized + debuginfo] target(s) in 21.49s
     Running `target/debug/web`

エラーがなくRunning target/debug/webの行で止まっていれば無事起動できています。では、ブラウザでアクセスしてみましょう。localhost:8080/hello/{任意の文字列}にアクセスするとHello {任意の文字列}!と表示するようなプログラムになっています。 ホスト側で起動したブラウザでlocalhost:8080/hello/abcにアクセスしてみます。

期待通りHello abc!と表示されています。

コメント