Rust と Actix を使用して Web サーバーをセットアップする方法
導入
このチュートリアルでは、DigitalOcean Droplet 上の Rust
と Actix-web
フレームワークを使用して Web サーバーを構築する方法を学びます。基本的なサーバーをセットアップし、Todo アイテムの単純なリストを管理するためのルートを作成し、Todo の取得や作成などの一般的な RESTful 操作をサポートします。
前提条件
始める前に、以下のものがあることを確認してください。
- Droplet を起動するための DigitalOcean Cloud アカウント。
- Ubuntu ドロップレットが稼働中です。
- Rust がドロップレットにインストールされました。
- 変数、関数、特性など、Rust の基本に精通していること。
ステップ 1 - Ubuntu ドロップレットのセットアップ
DigitalOcean ドロップレットに SSH 接続します: ターミナルを開き、次のコマンドを使用してドロップレットに SSH 接続します。
your_username
を実際のユーザー名に置き換え、your_droplet_ip
をドロップレットの IP アドレスに置き換えます。ssh your_username@your_droplet_ip
パッケージ リストを更新する: ログインしたら、パッケージ リストを更新して、利用可能なパッケージに関する最新情報を確認します。
sudo apt update
-
Rust のインストール: Rust をインストールするには、次のコマンドを使用します。これにより、Rust インストール スクリプトがダウンロードされ、実行されます。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
画面上の指示に従ってインストールを完了します。インストール後、端末を再起動するか、次のコマンドを実行する必要がある場合があります。
source $HOME/.cargo/env
必要なライブラリをインストールする: Rust アプリケーションを構築するために必要なライブラリをインストールします。以下を使用して
build-essential
とlibssl-dev
をインストールできます。sudo apt install build-essential libssl-dev
Rust のインストールを確認: Rust が正しくインストールされていることを確認するには、バージョンを確認します。
rustc --version
Cargo のインストール (Rust パッケージ マネージャー): Cargo は Rust とともに自動的にインストールされます。バージョンを確認することで、インストールを確認できます。
cargo --version
ステップ 2 - プロジェクトのセットアップ
cargo
を使用して新しい Rust プロジェクト sammy_todos
を作成しましょう
cargo new sammy_todos
次に、Cargo.toml
ファイルを見つけます。 Rust プロジェクトのルート ディレクトリに移動します。 Cargo.toml
ファイルは、プロジェクトを作成したのと同じディレクトリにあります (例: sammy_todos
)。次のコマンドを使用して、プロジェクト ディレクトリに変更できます。
cd sammy_todos/
ls
以下は自動的に生成される Rust プロジェクト ファイルです。
Cargo.toml src
actix-web
と serde
を依存関係として Cargo.toml
に追加します。ここで、serde
はシリアル化と逆シリアル化に必要です。
vi Cargo.toml
そして、dependency
の下に次の行を追加します。
[dependencies]
actix-web = "4.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
次に、依存関係をダウンロードしてコンパイルするには、以下のコマンドを使用します。
cargo build
ステップ 3 - 基本サーバーの作成
main.rs
に次のコード行を追加して、基本的なサーバーをセットアップします。プロジェクト内の src
ディレクトリに移動する必要があります。
use actix_web::{get, App, HttpServer, HttpResponse, Responder,web};
#[get("/")]
async fn index() -> impl Responder {
HttpResponse::Ok().body("Welcome to the Sammy Todo API!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(index)
})
.bind("127.0.0.1:8080")?
.run()
.await
}
サーバーを実行します。
cargo run
サーバーをテストするには、新しいターミナル セッションを開き、次のコマンドを実行します。
curl http://127.0.0.1:8080
次の応答が得られるはずです。
Welcome to the Sammy Todo API!
ステップ 4 - Todo モデルの追加
Todo モデルは、リクエストとレスポンスをシリアル化および逆シリアル化するために必要です。次のコード行を main.rs
ファイル内に追加します。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Todo {
id: i32,
title: String,
completed: bool,
}
ステップ 5 - Create todo を実装する
この API は todo を作成します。これは todo のみを返すダミー API ですが、データベースを使用して実装して永続化することができます。
#[get("/todos")]
async fn create_todo(todo: web::Json<Todo>) -> impl Responder {
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}
ステップ 6 - Get todo を実装する
この API は ID によって todo を返します。
#[get("/todos/{id}")]
async fn get_todo(id: web::Path<i32>) -> impl Responder {
let todo = Todo {
id: id.into_inner(),
title: "Learn Actix-Web".to_string(),
completed: false,
};
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}
サービスをサーバーにバインドする
Rust サーバー main.rs
は次のようになります。
use actix_web::{get, App, HttpServer, HttpResponse, Responder, web};
#[get("/")]
async fn index() -> impl Responder {
HttpResponse::Ok().body("Welcome to the Sammy Todo API!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(index)
.service(get_todo)
.service(create_todo)
})
.bind("127.0.0.1:8080")?
.run()
.await
}
use serde::{Serialize, Deserialize}; // Added Deserialize to imports
#[derive(Serialize, Deserialize)] // Ensure Deserialize is imported
struct Todo {
id: i32,
title: String,
completed: bool,
}
#[get("/todos")]
async fn create_todo(todo: web::Json<Todo>) -> impl Responder {
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}
#[get("/todos/{id}")]
async fn get_todo(id: web::Path<i32>) -> impl Responder {
let todo = Todo {
id: id.into_inner(),
title: "Learn Actix-Web".to_string(),
completed: false,
};
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}
ここで、curl
を使用して POST
リクエストを送信してテストできます。
curl -X POST -H "Content-Type: application/json" -d '{"title": "Buy groceries"}' http://127.0.0.1:8080/todos
結論
おめでとう! Rust と Actix を使用して基本的な Web サーバーを正常にセットアップしました。このチュートリアルでは、Todo アイテムを取得および作成するためのエンドポイントを作成し、より複雑なアプリケーションを構築するための強固な基盤を提供する方法を説明しました。アプリをさらに強化するには、データ永続性のためのデータベース ソリューションの統合を検討してください。これにより、Todo アイテムを効果的に保存および管理できるようになります。探索を続けて、コーディングを楽しんでください。