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`.
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.