JSON และสถานะ
สถานะร่วมและการทำให้เป็นอนุกรม
JSON และสถานะ เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
การคืนค่า JSON
Axum ทำให้การตอบกลับ JSON เป็นเรื่องง่าย ครอบชนิดข้อมูลใด ๆ ที่ใช้ Serialize ด้วย Json แล้วระบบจะกำหนดชนิดเนื้อหาและแปลงเนื้อหาให้
use axum::Json;
use serde::Serialize;
#[derive(Serialize)]
struct User { id: u32, name: String }
async fn get_user() -> Json<User> {
Json(User { id: 1, name: "Alice".into() })
}การแปลงคอลเลกชันเป็นอนุกรม
Vec ของรายการที่แปลงเป็นอนุกรมได้จะกลายเป็นอาร์เรย์ JSON โดยไม่ต้องทำงานเพิ่มเติม
use axum::Json;
use serde::Serialize;
#[derive(Serialize)]
struct Item { id: u32 }
async fn list() -> Json<Vec<Item>> {
Json(vec![Item { id: 1 }, Item { id: 2 }])
}การสร้างแบบจำลอง JSON ใน Rust ธรรมดา
การแปลง JSON เป็นอนุกรมก็คือการเปลี่ยนโครงสร้างให้เป็นสตริง ด้วย serde_json คุณเรียกใช้ to_string ได้ ต่อไปนี้คือแนวคิดโดยใช้รูปแบบที่สร้างขึ้นเอง
struct User { id: u32, name: String }
fn to_json(u: &User) -> String {
format!("{{\"id\":{},\"name\":\"{}\"}}", u.id, u.name)
}
fn main() {
let u = User { id: 1, name: "Alice".to_string() };
println!("{}", to_json(&u));
}สถานะที่ใช้ร่วมกันคืออะไร
สถานะที่ใช้ร่วมกันคือข้อมูลที่ตัวจัดการทุกตัวเข้าถึงได้ เช่น กลุ่มการเชื่อมต่อฐานข้อมูลหรือการตั้งค่า Axum ส่งต่อข้อมูลนี้ผ่านตัวดึงข้อมูล State
การกำหนดสถานะของแอป
กำหนดโครงสร้างที่เก็บข้อมูลร่วมกันของคุณ โดยมักครอบด้วย Arc เพื่อให้การโคลนมีต้นทุนต่ำ
use std::sync::Arc;
#[derive(Clone)]
struct AppState {
name: Arc<String>,
}การแนบสถานะเข้ากับ Router
ส่งสถานะให้กับ with_state Axum จะเก็บสถานะไว้และส่งให้ตัวจัดการที่ร้องขอ
use axum::{Router, routing::get};
async fn handler() -> &'static str { "ok" }
fn app(state: AppState) -> Router {
Router::new().route("/", get(handler)).with_state(state)
}การอ่านสถานะในตัวจัดการ
เพิ่มพารามิเตอร์ State เพื่อรับสำเนาสถานะภายในตัวจัดการ
use axum::extract::State;
async fn handler(State(state): State<AppState>) -> String {
state.name.to_string()
}สถานะที่ใช้ร่วมกันแบบเปลี่ยนแปลงได้
สำหรับข้อมูลที่เปลี่ยนแปลงได้ ให้ป้องกันด้วยตัวล็อก เช่น Mutex ที่อยู่ภายใน Arc วิธีนี้ทำให้แก้ไขข้อมูลพร้อมกันได้อย่างปลอดภัย
use std::sync::{Arc, Mutex};
#[derive(Clone)]
struct Counter {
count: Arc<Mutex<u32>>,
}การแก้ไขข้อมูลภายใน Mutex
ล็อก mutex แก้ไขค่า แล้วตัวป้องกันจะถูกทำลาย ตัวอย่างที่รันได้นี้จำลองการเพิ่มค่าที่ตัวจัดการจะทำ
use std::sync::{Arc, Mutex};
fn main() {
let count = Arc::new(Mutex::new(0u32));
{
let mut guard = count.lock().unwrap();
*guard += 1;
}
println!("count = {}", *count.lock().unwrap());
}การรับและสะท้อน JSON
รวม JSON ขาเข้าและขาออกเข้าด้วยกัน: แปลงเนื้อหา แปลงข้อมูล แล้วคืนค่าเป็น JSON นี่คือรูปแบบทั่วไปของการสร้างแล้วตอบกลับ
use axum::Json;
use serde::{Serialize, Deserialize};
#[derive(Deserialize)]
struct Input { name: String }
#[derive(Serialize)]
struct Output { greeting: String }
async fn greet(Json(i): Json<Input>) -> Json<Output> {
Json(Output { greeting: format!("Hi {}", i.name) })
}สถานะย่อยด้วย FromRef
เมื่อสถานะเก็บข้อมูลหลายส่วน ให้ derive FromRef เพื่อให้ตัวจัดการดึงเฉพาะส่วนที่ต้องการได้
use axum::extract::FromRef;
#[derive(Clone)]
struct Pool;
#[derive(Clone, FromRef)]
struct AppState {
pool: Pool,
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับ JSON และสถานะของคุณ
ทบทวน
คุณได้เรียนรู้เกี่ยวกับ JSON และสถานะที่ใช้ร่วมกันแล้ว:
- ครอบชนิดข้อมูลที่ใช้
Serializeด้วยJsonเพื่อใช้ตอบกลับ - กำหนดโครงสร้างสถานะที่ใช้
Cloneซึ่งมักครอบด้วยArc - แนบสถานะด้วย
with_stateและอ่านด้วยState - ใช้
Arc<Mutex>สำหรับข้อมูลร่วมกันที่แก้ไขได้ และใช้FromRefสำหรับสถานะย่อย
ถัดไป: มิดเดิลแวร์ด้วยเลเยอร์ของ tower
คำถามที่พบบ่อย
บทเรียน “JSON และสถานะ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “JSON และสถานะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “JSON และสถานะ”
สถานะร่วมและการทำให้เป็นอนุกรม คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “JSON และสถานะ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดเส้นทางด้วย Axum
- ตัวดึงข้อมูล
- JSON และสถานะ
- มิดเดิลแวร์