مقدمه
در این آموزش، نحوه ساخت وب سرور با Rust و چارچوب Actix-web را در DigitalOcean Droplet یاد خواهید گرفت. شما یک سرور اصلی راهاندازی میکنید و مسیرهایی را برای مدیریت یک لیست ساده از موارد Todo ایجاد میکنید که از عملیات معمول RESTful مانند بازیابی و ایجاد Todos پشتیبانی میکند.
پیش نیازها
قبل از شروع، اطمینان حاصل کنید که موارد زیر را دارید:
- یک حساب DigitalOcean Cloud برای چرخش یک Droplet.
- یک Ubuntu Droplet راه اندازی و اجرا می شود.
- Rust روی Droplet نصب شده است.
- آشنایی با اصول Rust شامل متغیرها، توابع و صفات.
مرحله 1 – راه اندازی Ubuntu Droplet
SSH در DigitalOcean Droplet: ترمینال خود را باز کنید و از دستور زیر برای SSH در قطره خود استفاده کنید. your_username را با نام کاربری واقعی خود و your_droplet_ip را با آدرس IP Droplet خود جایگزین کنید:
ssh your_username@your_droplet_ip
به روز رسانی لیست بسته: پس از ورود به سیستم، لیست بسته را به روز کنید تا مطمئن شوید آخرین اطلاعات بسته های موجود را دارید:
sudo apt update
Install 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
Install Cargo (Rust Package Manager): Cargo به صورت خودکار با Rust نصب می شود. با بررسی نسخه می توانید نصب آن را تأیید کنید:
cargo --version
مرحله 2 – راه اندازی پروژه
بیایید یک پروژه جدید rust sammy_todos با استفاده از محموله ایجاد کنیم
cargo new sammy_todos
سپس فایل Cargo.toml را پیدا کنید. به دایرکتوری ریشه پروژه Rust خود بروید. فایل Cargo.toml در همان دایرکتوری قرار دارد که پروژه خود را ایجاد کرده اید (به عنوان مثال، sammy_todos). برای تغییر به دایرکتوری پروژه خود می توانید از دستور زیر استفاده کنید:
cd sammy_todos/
ls
در زیر فایل های پروژه Rust هستند که به طور خودکار تولید می شوند:
Output
Cargo.toml src
actix-web و serde را به عنوان وابستگی در Cargo.toml اضافه کنید. در اینجا، serde برای Serialization و Deserialization مورد نیاز است.
vi Cargo.toml
و خطوط زیر را زیر وابستگی ها اضافه کنید.
[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
شما باید پاسخ زیر را دریافت کنید:
Output
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 را ایجاد می کند، و این یک API ساختگی است که فقط todo شما را برمی گرداند، اما می توانید آن را با پایگاه های داده پیاده سازی کنید تا پایدار باشد.
#[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 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 server 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())
}
اکنون، می توانید با ارسال یک درخواست POST با curl آن را آزمایش کنید:
curl -X POST -H "Content-Type: application/json" -d '{"title": "Buy groceries"}' http://127.0.0.1:8080/todos
نتیجه
تبریک می گویم! با استفاده از Rust و Actix یک وب سرور اصلی را با موفقیت راه اندازی کرده اید. این آموزش به شما یاد می دهد که نقاط پایانی را برای بازیابی و ایجاد موارد Todo ایجاد کنید و پایه ای محکم برای ساخت برنامه های پیچیده تر ارائه دهید. برای بهبود بیشتر برنامه خود، یک راه حل پایگاه داده را برای ماندگاری داده ها یکپارچه کنید، که به شما امکان می دهد موارد Todo خود را به طور موثر ذخیره و مدیریت کنید.