JSON og state
Delt state og serialisering
JSON og state er en gratis Lær at programmere i Rust-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lær at programmere i Rust, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lær at programmere i Rust-kurset indeholder 4 lektioner i alt.
Returnering af JSON
Axum gør JSON-svar nemme. Pak enhver Serialize-type ind i Json, så angiver den indholdstypen og serialiserer brødteksten.
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() })
}Serialisering af samlinger
En Vec med serialiserbare elementer bliver til et JSON-array. Der kræves ikke yderligere arbejde.
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 }])
}Modellering af JSON i almindelig Rust
JSON-serialisering er blot at omdanne en struktur til en streng. Med serde_json kalder du to_string. Her vises idéen med manuel formatering.
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));
}Hvad er delt tilstand?
Delt tilstand er data, som alle håndteringsfunktioner kan få adgang til, f.eks. en databasepulje eller konfiguration. Axum fører den igennem med State-udtrækkeren.
Definition af appens tilstand
Definér en struktur, der indeholder dine delte data. Ofte omslutter den en Arc, så kloning er billig.
use std::sync::Arc;
#[derive(Clone)]
struct AppState {
name: Arc<String>,
}Tilknytning af tilstand til routeren
Giv tilstanden til with_state. Axum gemmer den og stiller den til rådighed for håndteringsfunktioner, der anmoder om den.
use axum::{Router, routing::get};
async fn handler() -> &'static str { "ok" }
fn app(state: AppState) -> Router {
Router::new().route("/", get(handler)).with_state(state)
}Læsning af tilstand i en håndteringsfunktion
Tilføj en State-parameter for at modtage en klon af din tilstand inde i håndteringsfunktionen.
use axum::extract::State;
async fn handler(State(state): State<AppState>) -> String {
state.name.to_string()
}Foranderlig delt tilstand
Data, der ændrer sig, skal beskyttes med en lås som Mutex bag en Arc. Det giver sikker samtidig ændring.
use std::sync::{Arc, Mutex};
#[derive(Clone)]
struct Counter {
count: Arc<Mutex<u32>>,
}Ændring bag en Mutex
Lås mutexen, modificér værdien, og lad derefter låsevagten blive frigivet. Dette kørbare eksempel afspejler den forøgelse, en håndteringsfunktion ville udføre.
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());
}Modtagelse og gentagelse af JSON
Kombinér JSON-input og -output: deserialisér brødteksten, transformér den, og returnér JSON. Det er et almindeligt mønster, hvor du opretter noget og derefter svarer.
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) })
}Deltilstand med FromRef
Når tilstanden indeholder flere dele, kan du udlede FromRef, så håndteringsfunktioner kun kan udtrække den del, de har brug for.
use axum::extract::FromRef;
#[derive(Clone)]
struct Pool;
#[derive(Clone, FromRef)]
struct AppState {
pool: Pool,
}Hurtigt tjek
Test din forståelse af JSON og tilstand.
Opsummering
Du har lært om JSON og delt tilstand:
- Pak
Serialize-typer ind iJsonfor at sende svar - Definér en
Clone-tilstandsstruktur, som ofte omslutterArc - Tilknyt den med
with_state, og læs den medState - Brug
Arc<Mutex>til foranderlige delte data ogFromReftil deltilstande
Næste trin: middleware med tower-lag.
Lær Rust med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 144
Ofte stillede spørgsmål
Er lektionen “JSON og state” gratis?
Ja — alle 3 lektioner i læringssporet Lær at programmere i Rust, inklusive “JSON og state”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lær at programmere i Rust-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “JSON og state”?
Delt state og serialisering Du øver dig i Lær at programmere i Rust med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lær at programmere i Rust?
Der kræves ingen tidligere erfaring. Lær at programmere i Rust på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “JSON og state”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lær at programmere i Rust-lektion?
Ja. Alle Lær at programmere i Rust-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Routing med Axum
- Extractors
- JSON og state
- Middleware