Learn Rust Coding · บทเรียน

REST APIs ด้วย Actix-web/Rocket

พัฒนา REST API ด้วยกรอบงานเว็บ Rust สมัยใหม่ เช่น Actix-web หรือ Rocket พร้อมจัดการเส้นทาง คำขอ และการตอบกลับ

บทเรียน 1 จาก 311 ขั้นตอน

REST APIs ด้วย Actix-web/Rocket เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 3 บทเรียน

REST API คืออะไร

REST หรือ REpresentational State Transfer คือรูปแบบสถาปัตยกรรมสำหรับแอปพลิเคชันบนเครือข่าย โดยกำหนดหลักการชุดหนึ่งเกี่ยวกับวิธีที่บริการเว็บควรสื่อสารกัน

ลองนึกภาพว่า REST เป็นแนวทางสำหรับสร้างบริการเว็บที่ไม่มีสถานะ แคชได้ และใช้วิธีมาตรฐานของ HTTP เพื่อโต้ตอบกับทรัพยากร

  • ทรัพยากร: สิ่งใดก็ตามที่สามารถระบุชื่อได้ เช่น ผู้ใช้ สินค้า หรือคำสั่งซื้อ
  • URI: ตัวระบุเฉพาะสำหรับทรัพยากร (เช่น /users/123)
  • วิธี HTTP: การดำเนินการมาตรฐานที่ทำกับทรัพยากร (GET, POST, PUT, DELETE)

เหตุใดจึงใช้ Rust สำหรับบริการเว็บ

Rust มีข้อได้เปรียบเฉพาะตัวสำหรับการพัฒนาบริการเว็บ จึงเป็นตัวเลือกที่ยอดเยี่ยมสำหรับ API ที่มีประสิทธิภาพสูงและเชื่อถือได้:

  • ประสิทธิภาพ: การแปลงนามธรรมแบบไม่มีต้นทุนของ Rust ทำให้ได้โค้ดที่มีประสิทธิภาพสูง ซึ่งมักเทียบเคียงได้กับ C/C++
  • ความปลอดภัยของหน่วยความจำ: ระบบการครอบครองช่วยป้องกันข้อผิดพลาดทั่วไป เช่น การอ้างอิงตัวชี้ว่างและการแข่งขันของข้อมูล ส่งผลให้บริการมีความทนทานมากขึ้น
  • การทำงานพร้อมกัน: รูปแบบ async/await ของ Rust เมื่อทำงานร่วมกับการรับประกันด้านความปลอดภัย ทำให้การสร้างบริการเว็บที่ทำงานพร้อมกันเป็นเรื่องที่ 'ไร้กังวล'
  • ความน่าเชื่อถือ: ระบบชนิดข้อมูลที่เข้มงวดและการตรวจสอบขณะคอมไพล์ช่วยตรวจพบข้อผิดพลาดได้ตั้งแต่เนิ่น ๆ

ทำความรู้จัก Actix-web

สำหรับการสร้างบริการเว็บด้วย Rust เรามักใช้เฟรมเวิร์ก Actix-web เป็นเฟรมเวิร์กเว็บสำหรับ Rust ที่ทรงพลัง ใช้งานได้จริง และรวดเร็วอย่างยิ่ง

เฟรมเวิร์กนี้สร้างขึ้นบน Actix ซึ่งเป็นเฟรมเวิร์กแบบนักแสดง แต่คุณไม่จำเป็นต้องเข้าใจนักแสดงเพื่อใช้งาน Actix-web อย่างมีประสิทธิภาพ เฟรมเวิร์กนี้ออกแบบมาสำหรับการดำเนินการแบบอะซิงโครนัส จึงเหมาะอย่างยิ่งกับงานที่ถูกจำกัดด้วยการรับส่งข้อมูล เช่น การจัดการคำขอ API จำนวนมากที่ทำงานพร้อมกัน

Actix-web มีเครื่องมือสำหรับการกำหนดเส้นทาง การจัดการคำขอและการตอบกลับ มิดเดิลแวร์ และอื่น ๆ อีกมากมาย ช่วยให้การสร้าง API ที่ซับซ้อนง่ายขึ้น

การตั้งค่าโครงการและส่วนอ้างอิง

เริ่มต้นด้วยการสร้างโครงการ Rust ใหม่และเพิ่มส่วนอ้างอิงที่จำเป็น เราจะใช้ actix-web เป็นเฟรมเวิร์ก และใช้ serde สำหรับการแปลงข้อมูล JSON ไปเป็นรูปแบบอื่นและย้อนกลับ

ขั้นแรก ให้สร้างโครงการใหม่:

cargo new my_rest_api --bin

จากนั้น เพิ่มบรรทัดเหล่านี้ลงในไฟล์ Cargo.toml ของคุณ ภายใต้ส่วน [dependencies]:

[dependencies]
actix-web = "4"
serde = { version = "1.0", features = ["derive"] }

เซิร์ฟเวอร์ Actix-web แรกของคุณ

มาเขียนเซิร์ฟเวอร์ Actix-web ขั้นต่ำกัน โค้ดนี้จะตั้งค่าโครงสร้างพื้นฐานเพื่อรอฟังคำขอ HTTP ขาเข้าที่พอร์ต 8080 ขณะนี้ยังไม่ได้จัดการเส้นทางใดโดยเฉพาะ แต่ถือเป็นพื้นฐานสำคัญ

มาโคร #[actix_web::main] ทำให้ async fn main ของเราใช้งานร่วมกับรันไทม์ของ Actix-web ได้

use actix_web::{App, HttpServer};

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        // Our application instance, where we'll add routes
        App::new()
    })
    .bind(("127.0.0.1", 8080))? // Bind to an IP address and port
    .run() // Start the server
    .await // Await its completion
}

กำหนดเส้นทาง GET

ตอนนี้มาเพิ่มเส้นทางอย่างง่ายให้เซิร์ฟเวอร์ของเรา เส้นทางจะจับคู่พาธและวิธีของคำขอ HTTP ขาเข้า (เช่น GET /hello) กับฟังก์ชันตัวจัดการที่ระบุ

ฟังก์ชันตัวจัดการ hello_world ของเราจะส่งคืนสตริงอย่างง่าย web::get().to() จะลงทะเบียนตัวจัดการนี้สำหรับคำขอ GET ไปยังพาธ /hello

use actix_web::{web, App, HttpServer, Responder};

// A handler function that returns a simple string response
async fn hello_world() -> impl Responder {
    "Hello, Actix-web!"
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        App::new()
            // Register our route: GET /hello maps to hello_world()
            .route("/hello", web::get().to(hello_world))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

พารามิเตอร์พาธสำหรับเส้นทางแบบไดนามิก

API มักต้องจัดการส่วนที่เปลี่ยนแปลงได้ใน URL เช่น ID หรือชื่อ Actix-web ใช้ พารามิเตอร์พาธ เพื่อดึงค่าเหล่านี้

เรากำหนดตัวแทนไว้ในเส้นทาง (เช่น /{name}) จากนั้นในตัวจัดการ เราใช้ web::Path<String> (หรือชนิดอื่นที่สามารถดีซีเรียลไลซ์ได้) เพื่อดึงค่าออกมา

use actix_web::{web, App, HttpServer, Responder};

// Handler function with a path parameter 'name'
async fn greet_name(name: web::Path<String>) -> impl Responder {
    format!("Hello, {}!", name.into_inner())
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        App::new()
            // Route with a dynamic path segment for a name
            .route("/greet/{name}", web::get().to(greet_name))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

จัดการคำขอ POST และ JSON

สำหรับการสร้างหรือปรับปรุงทรัพยากร เราใช้คำขอ POST หรือ PUT โดยมักส่งข้อมูลในเนื้อหาคำขอเป็น JSON

Actix-web ทำให้การจัดการ JSON เป็นเรื่องง่ายด้วย web::Json<T> เรากำหนด Rust struct ที่ตรงกับโครงสร้าง JSON ที่คาดไว้ สืบทอด Deserialize จาก serde แล้ว Actix-web จะแยกวิเคราะห์ JSON ขาเข้าเป็นสตรักต์ของเราโดยอัตโนมัติ

use actix_web::{web, App, HttpServer, Responder};
use serde::{Deserialize, Serialize};

// Define a struct to represent our incoming JSON data
#[derive(Deserialize, Serialize)]
struct User {
    username: String,
    email: String,
}

// Handler for POST requests that accepts a JSON User object
async fn create_user(user: web::Json<User>) -> impl Responder {
    // In a real app, you'd save this user to a database
    format!("User created: {} ({})", user.username, user.email)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    HttpServer::new(|| {
        App::new()
            // POST /users expects a JSON body and maps to create_user()
            .route("/users", web::post().to(create_user))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

สร้าง API อย่างง่ายด้วยสถานะ

มารวมสิ่งที่เราเรียนรู้เพื่อสร้าง API ขนาดเล็กที่จัดการรายชื่อผู้ใช้ในหน่วยความจำ เราจะใช้ web::Data เพื่อแชร์สถานะเฉพาะของแอปพลิเคชัน (รายชื่อผู้ใช้ของเรา) ระหว่างตัวจัดการต่าง ๆ

เราใช้ std::sync::Mutex เพื่ออนุญาตให้เข้าถึง Vec<User> แบบเปลี่ยนแปลงได้อย่างปลอดภัยจากคำขอหลายรายการที่ทำงานพร้อมกัน โดยจะมีจุดปลายทางสำหรับ GET /users และ POST /users

use actix_web::{web, App, HttpServer, Responder, HttpResponse};
use serde::{Deserialize, Serialize};
use std::sync::Mutex; // For shared mutable state

// Define a User struct that can be serialized/deserialized and cloned
#[derive(Deserialize, Serialize, Clone)]
struct User {
    id: u32,
    username: String,
    email: String,
}

// Application state to hold our users and track next ID
struct AppState {
    users: Mutex<Vec<User>>,
    next_id: Mutex<u32>,
}

// Handler to get all users
async fn get_users(data: web::Data<AppState>) -> impl Responder {
    let users = data.users.lock().unwrap(); // Acquire a lock
    web::Json(users.clone()) // Return users as JSON
}

// Handler to create a new user
async fn create_user(
    data: web::Data<AppState>,
    new_user: web::Json<User>,
) -> impl Responder {
    let mut users = data.users.lock().unwrap();
    let mut next_id = data.next_id.lock().unwrap();

    let user = User {
        id: *next_id,
        username: new_user.username.clone(),
        email: new_user.email.clone(),
    };
    users.push(user.clone());
    *next_id += 1; // Increment for the next user
    HttpResponse::Created().json(user) // Return 201 Created status and user
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Server running at http://127.0.0.1:8080");
    // Create shared application state
    let app_state = web::Data::new(AppState {
        users: Mutex::new(vec![]), // Initialize with an empty user list
        next_id: Mutex::new(1),    // Start IDs from 1
    });

    HttpServer::new(move || { // 'move' closure to capture app_state
        App::new()
            .app_data(app_state.clone()) // Register shared state with the app
            .route("/users", web::get().to(get_users))
            .route("/users", web::post().to(create_user))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

ตรวจสอบแนวคิด API อย่างรวดเร็ว

คุณได้เรียนรู้วิธีตั้งค่าเซิร์ฟเวอร์ Actix-web พื้นฐานและจัดการคำขอ HTTP ประเภทต่าง ๆ แล้ว มาทดสอบความเข้าใจกัน

ทบทวนและขั้นตอนถัดไป

ทำได้ดีมาก! คุณได้เริ่มต้นสร้าง REST API ด้วย Rust และ Actix-web แล้ว

  • เราได้สำรวจพื้นฐานของ REST API และเหตุผลที่ Rust เหมาะสมอย่างยิ่ง
  • คุณได้เรียนรู้การตั้งค่าโครงการ Actix-web พื้นฐาน
  • เราได้กล่าวถึงการกำหนดเส้นทาง GET และ POST
  • คุณได้เห็นวิธีดึง พารามิเตอร์พาธ และจัดการข้อมูล JSON
  • ท้ายที่สุด คุณได้สร้าง API อย่างง่ายที่จัดการสถานะในหน่วยความจำโดยใช้ web::Data

ถัดไป คุณจะเจาะลึกการเชื่อมต่อฐานข้อมูลและการจัดการข้อผิดพลาดอย่างรัดกุม เพื่อสร้างบริการเว็บที่ทรงพลังและพร้อมใช้งานจริงยิ่งขึ้น

เริ่มต้นได้ฟรี

เรียนรู้ Rust ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

คำถามที่พบบ่อย

บทเรียน “REST APIs ด้วย Actix-web/Rocket” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “REST APIs ด้วย Actix-web/Rocket” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “REST APIs ด้วย Actix-web/Rocket”

พัฒนา REST API ด้วยกรอบงานเว็บ Rust สมัยใหม่ เช่น Actix-web หรือ Rocket พร้อมจัดการเส้นทาง คำขอ และการตอบกลับ คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “REST APIs ด้วย Actix-web/Rocket” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. REST APIs ด้วย Actix-web/Rocket
  2. การเชื่อมต่อฐานข้อมูล (SQLx/Diesel)
  3. การยืนยันตัวตนและการอนุญาตสิทธิ์
← กลับไปที่ Learn Rust Coding