Rust の actix-web で GET と POST リクエストを受け取る

株式会社プライムストラクチャーのエンジニアの Saya です。

今回は Rust の API サーバである actix-web を動かし、.env ファイルの読み込みと actix-web で GET・POST リクエストの受け取りを行いたいと思います。

actix-web とは

Rust の Web フレームワークです。
Actix – Actor System and Web Framework for Rust

検証環境

この検証は以下の環境で行いました。

macOS Mojave 10.14.6
Docker Engine 19.03.1
Docker Compose 1.24.1
rustc 1.36.0

ファイル構成

ファイル構成は以下のようにします。

-  src
    - main.rs
-  docker
   - rust
     - Dockerfile
   - docker-compose.yml
- .env

メインプログラムの作成

src フォルダの中に main.rs を作成し、以下のように記述します。

<main.rs>
use actix_web::{get, post, App, HttpServer, HttpResponse, Responder};
use dotenv;

#[get("/get")]
fn get() -> impl Responder {
    HttpResponse::Ok().body("GET 成功")
}

#[post("/post")]
fn post() -> impl Responder {
    HttpResponse::Ok().body("POST 成功")
}

fn main() -> std::io::Result<()> {
    HttpServer::new(
        || App::new()
            .service(get)
            .service(post)
        )
        .bind(dotenv::var("HOST").unwrap().to_string() + ":" + &dotenv::var("PORT").unwrap())?
        .run()
}

このプログラムは以下のような挙動になります。
http://localhost:8777/get に GET リクエストを送ると、GET 成功と表示される。
http://localhost:8777/post に POST リクエストを送ると、POST 成功と表示される。

docker-compose の作成

docker フォルダの中に docker-compose.yml を作成し、以下のように記述します。

<docker-compose.yml>
version: "3.6"

services:
  rust-actix-web:
    build: ./rust
    tty: true
    volumes:
      - ../:/src
    ports:
      - 8777:80

Dockerfile の作成

rust フォルダの中に Dockerfile を作成し、以下のように記述します。
USER という環境変数が必要になるので ENV コマンドで定義します。

<Dockerfile>
FROM rust:latest

ENV USER=userName
WORKDIR /src
RUN apt-get update

コンテナを立ち上げる

以下のコマンドを実行してコンテナを立ち上げます。

$ cd docker
$ docker-compose up -d

コンテナが立ち上がったら以下のコマンドでコンテナの中に入ります。

$ docker-compose exec rust-actix-web bash

ファイルの設定

コンテナの中に入ったら以下のコマンドで cargo の初期設定を行います。

$ cargo init

次に Cargo.toml に以下の内容を付け加えます。
コンテナ内・ローカルどちらのファイルに追加しても大丈夫です。
.env ファイルの読み込みをするための dotenv と、actix-web を指定します。

<Cargo.toml>
[dependencies]
actix-web = "1.0"
dotenv = "0.14.1"

.env ファイルを作成して以下のように記述します。

HOST=rust-actix-web
PORT=80

それでは実行してみます。
パッケージのインストールが完了すると、web ページへアクセス出来るようになります。

$ cargo run

Postman などを使って以下の条件でリクエストが返ってくるか確認します。

localhost:8777/get

localhost:8777/post

まとめ

今回は Rust の API サーバである actix-web を動かし、.env ファイルの読み込みと actix-web で GET・POST リクエストの受け取りを行いました。

GET と POST リクエストの受け取りが出来るようになったことで、 Rust を使って API の作成が出来るようになりました。

参考文献

Installation
Getting Started