Study
Rocket

JSON Body dengan Serde

Penjelasan

Rocket menyediakan tipe `Json<T>` (dari modul `rocket::serde::json`) untuk menerima body JSON, konsepnya mirip Axum tapi cara pemakaiannya sedikit berbeda — `Json<T>` dijadikan tipe parameter biasa di signature fungsi handler, bukan lewat extractor path terpisah. Untuk memakainya, struct target harus meng-implementasi `Deserialize` dari `rocket::serde` (biasanya lewat re-export, cukup `use rocket::serde::{Deserialize, json::Json}`). Kalau body request bukan JSON valid sesuai struct, Rocket otomatis mengembalikan 400 sebelum handler-mu dipanggil. Satu hal penting: parameter `Json<T>` di Rocket TIDAK terikat pada segmen path/query dalam attribute macro — cukup tambahkan sebagai parameter fungsi biasa, dan Rocket otomatis tahu itu berasal dari body karena tipenya `Json<T>`. Kamu tidak perlu mendeklarasikan apa pun tambahan di dalam `#[post(...)]` untuk ini, kecuali kalau ingin eksplisit dengan `data = "<...>"`.

Contoh Konsep

// cargo add rocket --features json

#[macro_use] extern crate rocket;

use rocket::serde::{Deserialize, json::Json};

#[derive(Deserialize)]
#[serde(crate = "rocket::serde")]
struct CreateNote {
    title: String,
    body: String,
}

#[post("/notes", data = "<payload>")]
fn create_note(payload: Json<CreateNote>) -> String {
    format!("Catatan '{}' berhasil dibuat", payload.title)
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![create_note])
}

// curl -X POST http://127.0.0.1:8000/notes \
//   -H "Content-Type: application/json" \
//   -d '{"title":"Belajar Rocket","body":"Request guard itu unik"}'

Praktikum

Buat struct `LoginRequest` dengan field `username` dan `password`, lalu handler `login` yang menerima `Json<LoginRequest>` lewat parameter `data`.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Jangan lupa atribut `#[serde(crate = "rocket::serde")]` di atas setiap struct yang dipakai dengan `Json<T>` versi Rocket — ini beda dari Axum yang langsung memakai crate `serde` biasa. Rocket punya re-export `serde` sendiri supaya versi Serde-nya tetap kompatibel dengan versi internal Rocket, jadi atribut ini wajib supaya derive macro tahu harus memakai jalur yang benar.