REST APIs ด้วย Actix-web/Rocket
พัฒนา REST API ด้วยกรอบงานเว็บ Rust สมัยใหม่ เช่น Actix-web หรือ Rocket พร้อมจัดการเส้นทาง คำขอ และการตอบกลับ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- REST APIs ด้วย Actix-web/Rocket
- การเชื่อมต่อฐานข้อมูล (SQLx/Diesel)
- การยืนยันตัวตนและการอนุญาตสิทธิ์