0Pricing
Learn Rust Coding · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การกำหนดเส้นทางด้วย Axum
  2. ตัวดึงข้อมูล
  3. JSON และสถานะ
  4. มิดเดิลแวร์
← กลับไปที่ Learn Rust Coding