ウェブサイト検索

Rust と Actix を使用して Web サーバーをセットアップする方法


導入

このチュートリアルでは、DigitalOcean Droplet 上の RustActix-web フレームワークを使用して Web サーバーを構築する方法を学びます。基本的なサーバーをセットアップし、Todo アイテムの単純なリストを管理するためのルートを作成し、Todo の取得や作成などの一般的な RESTful 操作をサポートします。

前提条件

始める前に、以下のものがあることを確認してください。

  • Droplet を起動するための DigitalOcean Cloud アカウント。
  • Ubuntu ドロップレットが稼働中です。
  • Rust がドロップレットにインストールされました。
  • 変数、関数、特性など、Rust の基本に精通していること。

ステップ 1 - Ubuntu ドロップレットのセットアップ

  1. DigitalOcean ドロップレットに SSH 接続します: ターミナルを開き、次のコマンドを使用してドロップレットに SSH 接続します。 your_username を実際のユーザー名に置き換え、your_droplet_ip をドロップレットの IP アドレスに置き換えます。

    ssh your_username@your_droplet_ip
    
  2. パッケージ リストを更新する: ログインしたら、パッケージ リストを更新して、利用可能なパッケージに関する最新情報を確認します。

    sudo apt update
    
  3. Rust のインストール: Rust をインストールするには、次のコマンドを使用します。これにより、Rust インストール スクリプトがダウンロードされ、実行されます。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

    画面上の指示に従ってインストールを完了します。インストール後、端末を再起動するか、次のコマンドを実行する必要がある場合があります。

    source $HOME/.cargo/env
    
  4. 必要なライブラリをインストールする: Rust アプリケーションを構築するために必要なライブラリをインストールします。以下を使用して build-essentiallibssl-dev をインストールできます。

    sudo apt install build-essential libssl-dev
    
  5. Rust のインストールを確認: Rust が正しくインストールされていることを確認するには、バージョンを確認します。

    rustc --version
    
  6. 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-webserde を依存関係として 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 アイテムを効果的に保存および管理できるようになります。探索を続けて、コーディングを楽しんでください。