株式会社プライムストラクチャーのエンジニアの 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 などを使って以下の条件でリクエストが返ってくるか確認します。
まとめ
今回は Rust の API サーバである actix-web を動かし、.env ファイルの読み込みと actix-web で GET・POST リクエストの受け取りを行いました。
GET と POST リクエストの受け取りが出来るようになったことで、 Rust を使って API の作成が出来るようになりました。