API REST dengan Actix-web/Rocket
Bangunkan API berasaskan REST menggunakan rangka kerja web Rust moden seperti Actix-web atau Rocket, dengan mengendalikan laluan, permintaan dan respons.
API REST dengan Actix-web/Rocket ialah pelajaran Belajar Pengaturcaraan Rust percuma di CoddyKit. Ini ialah pelajaran 1 daripada 3. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Belajar Pengaturcaraan Rust, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 3 pelajaran.
Apakah itu API REST?
REST, atau REpresentational State Transfer, ialah gaya seni bina untuk aplikasi berangkaian. REST mentakrifkan satu set prinsip tentang cara perkhidmatan web harus berkomunikasi.
Anggaplah ia sebagai satu set panduan untuk membina perkhidmatan web yang tidak menyimpan keadaan, boleh dicachekan dan menggunakan kaedah HTTP standard untuk berinteraksi dengan sumber.
- Sumber: Apa-apa sahaja yang boleh dinamakan, seperti pengguna, produk atau pesanan.
- URI: Pengecam unik untuk sumber (contohnya,
/users/123). - Kaedah HTTP: Tindakan standard yang dilakukan terhadap sumber (GET, POST, PUT, DELETE).
Mengapa Rust untuk Perkhidmatan Web?
Rust menawarkan kelebihan unik untuk pembangunan perkhidmatan web, menjadikannya pilihan yang kukuh bagi API berprestasi tinggi dan boleh dipercayai:
- Prestasi: Abstraksi tanpa kos Rust menghasilkan kod yang sangat cekap, sering setanding dengan C/C++.
- Keselamatan Memori: Sistem pemilikan menghalang pepijat biasa seperti penyahrujukan penuding null dan perlumbaan data, lalu menghasilkan perkhidmatan yang lebih teguh.
- Keserentakan: Model async/await Rust, digabungkan dengan jaminan keselamatannya, memudahkan pembinaan perkhidmatan web serentak tanpa rasa bimbang.
- Kebolehpercayaan: Sistem jenis yang kukuh dan pemeriksaan masa kompilasi mengesan banyak ralat lebih awal.
Kenali Actix-web
Untuk membina perkhidmatan web dalam Rust, kita sering menggunakan rangka kerja. Actix-web ialah rangka kerja web Rust yang berkuasa, pragmatik dan sangat pantas.
Ia dibina berasaskan Actix, iaitu rangka kerja pelaku, tetapi anda tidak perlu memahami pelaku untuk menggunakan Actix-web dengan berkesan. Ia direka untuk operasi tak segerak, menjadikannya sesuai untuk tugas terikat I/O seperti mengendalikan banyak permintaan API serentak.
Actix-web menyediakan alat untuk penghalaan, pengendalian permintaan/respons, perisian tengah dan banyak lagi, sekali gus memudahkan penciptaan API yang kompleks.
Persediaan Projek & Kebergantungan
Untuk bermula, kita akan mencipta projek Rust baharu dan menambah kebergantungan yang diperlukan. Kita akan menggunakan actix-web untuk rangka kerja dan serde untuk mensiri/mensahiri data JSON.
Mula-mula, cipta projek baharu:
cargo new my_rest_api --bin
Kemudian, tambahkan baris berikut ke dalam fail Cargo.toml anda di bawah bahagian [dependencies]:
[dependencies]
actix-web = "4"
serde = { version = "1.0", features = ["derive"] }
Pelayan Actix-web Pertama Anda
Mari tulis pelayan Actix-web yang minimum. Kod ini menyediakan struktur asas untuk mendengar permintaan HTTP masuk pada port 8080. Kod ini belum mengendalikan sebarang laluan khusus, tetapi inilah asasnya.
Makro #[actix_web::main] menjadikan async fn main kita serasi dengan masa jalan 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
}Mentakrifkan Laluan GET
Sekarang, mari tambahkan laluan ringkas pada pelayan kita. Satu route memetakan laluan dan kaedah permintaan HTTP masuk (seperti GET /hello) kepada fungsi pengendali tertentu.
Fungsi pengendali kita, hello_world, hanya akan mengembalikan rentetan. web::get().to() mendaftarkan pengendali ini untuk permintaan GET ke laluan /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
}Parameter Laluan untuk Laluan Dinamik
API sering perlu mengendalikan bahagian dinamik dalam URL, seperti ID atau nama. Actix-web menggunakan parameter laluan untuk menangkap nilai ini.
Kita mentakrifkan ruang letak dalam laluan (contohnya, /{name}). Dalam pengendali, kita menggunakan web::Path<String> (atau apa-apa jenis lain yang boleh disahsiri) untuk mengekstrak nilai tersebut.
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
}Mengendalikan Permintaan POST & JSON
Untuk mencipta atau mengemas kini sumber, kita menggunakan permintaan POST atau PUT, yang selalunya menghantar data dalam badan permintaan sebagai JSON.
Actix-web memudahkan pengendalian JSON dengan web::Json<T>. Kita mentakrifkan struct Rust yang sepadan dengan struktur JSON yang dijangka, mendapatkan Deserialize daripada serde, dan Actix-web akan menghuraikan JSON masuk secara automatik ke dalam struct kita.
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
}Membina API Ringkas dengan Keadaan
Mari gabungkan perkara yang telah kita pelajari untuk membina API kecil yang mengurus senarai pengguna dalam memori. Kita akan menggunakan web::Data untuk berkongsi keadaan khusus aplikasi (senarai pengguna kita) merentas pengendali.
std::sync::Mutex digunakan untuk membenarkan capaian boleh ubah dengan selamat kepada Vec<User> kita daripada berbilang permintaan serentak. Kita akan mempunyai titik akhir GET /users dan 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
}Semakan Pantas Konsep API
Anda telah mempelajari cara menyediakan pelayan Actix-web asas dan mengendalikan pelbagai permintaan HTTP. Mari uji pemahaman anda!
Imbas Kembali & Langkah Seterusnya
Syabas! Anda telah mengambil langkah pertama untuk membina API RESTful dengan Rust dan Actix-web.
- Kita meneroka asas API REST dan sebab Rust sangat sesuai untuknya.
- Anda belajar menyediakan projek Actix-web asas.
- Kita membincangkan cara mentakrifkan laluan GET dan POST.
- Anda melihat cara mengekstrak parameter laluan dan mengendalikan muatan JSON.
- Akhir sekali, anda membina API ringkas yang mengurus keadaan dalam memori menggunakan
web::Data.
Seterusnya, anda akan mendalami integrasi pangkalan data dan pengendalian ralat yang teguh untuk membina perkhidmatan web yang lebih berkuasa dan bersedia untuk pengeluaran!
Pelajari Rust dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 39
- Pelajaran
- 144
Soalan Lazim
Adakah pelajaran “API REST dengan Actix-web/Rocket” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Belajar Pengaturcaraan Rust, termasuk “API REST dengan Actix-web/Rocket”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 3 pelajaran.
Apakah yang akan saya pelajari dalam “API REST dengan Actix-web/Rocket”?
Bangunkan API berasaskan REST menggunakan rangka kerja web Rust moden seperti Actix-web atau Rocket, dengan mengendalikan laluan, permintaan dan respons. Anda berlatih Belajar Pengaturcaraan Rust menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Belajar Pengaturcaraan Rust?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Belajar Pengaturcaraan Rust di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 3.
Berapa lamakah pelajaran “API REST dengan Actix-web/Rocket” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Belajar Pengaturcaraan Rust ini?
Ya. Setiap pelajaran Belajar Pengaturcaraan Rust menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- API REST dengan Actix-web/Rocket
- Integrasi Pangkalan Data (SQLx/Diesel)
- Pengesahan dan Kebenaran