Rocket Core Knowledge
Full Reference: See advanced.md for custom guards (authentication, API key), fairings (CORS, timing), database state, error catchers, and testing patterns.
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:rocketfor comprehensive documentation.
Basic Setup
# Cargo.toml
[dependencies]
rocket = { version = "0.5", features = ["json"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
#[macro_use] extern crate rocket;
#[get("/")]
fn index() -> &'static str {
"Hello, World!"
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![index])
}
Routing
#[get("/users/<id>")]
fn get_user(id: u32) -> String {
format!("User {}", id)
}
#[post("/users", data = "<user>")]
fn create_user(user: Json<CreateUser>) -> Json<User> {
Json(User::from(user.into_inner()))
}
#[get("/files/<path..>")]
fn get_file(path: PathBuf) -> Option<NamedFile> {
NamedFile::open(Path::new("static/").join(path)).ok()
}
// Query parameters
#[derive(FromForm)]
struct Pagination { page: Option<u32>, per_page: Option<u32> }
#[get("/users?<pagination..>")]
fn list_users(pagination: Pagination) -> Json<Vec<User>> {
let page = pagination.page.unwrap_or(1);
Json(fetch_users(page, pagination.per_page.unwrap_or(20)))
}
// Mounting
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/", routes![index])
.mount("/api/v1", routes![list_users, get_user, create_user])
}
Request Guards
// JSON body
#[post("/users", data = "<user>")]
fn create_user(user: Json<CreateUser>) -> Json<User> {
Json(User::from(user.into_inner()))
}
// Form data
#[post("/login", data = "<login>")]
fn login(login: Form<LoginForm>) -> String {
format!("Welcome, {}", login.username)
}
// Cookies
#[get("/session")]
fn session(cookies: &CookieJar<'_>) -> Option<String> {
cookies.get("session_id").map(|c| c.value().to_string())
}
State Management
use std::sync::atomic::{AtomicU64, Ordering};
struct HitCount(AtomicU64);
#[get("/count")]
fn count(hit_count: &State<HitCount>) -> String {
let count = hit_count.0.fetch_add(1, Ordering::Relaxed);
format!("Hits: {}", count)
}
#[launch]
fn rocket() -> _ {
rocket::build()
.manage(HitCount(AtomicU64::new(0)))
.mount("/", routes![count])
}
Fairings (Middleware)
use rocket::fairing::AdHoc;
#[launch]
fn rocket() -> _ {
rocket::build()
.attach(AdHoc::on_liftoff("Liftoff", |_| Box::pin(async {
println!("Rocket has launched!");
})))
}
When NOT to Use This Skill
- Axum projects - Axum integrates better with Tower ecosystem
- Actix-web projects - Actix has more performance optimizations
- Stable Rust requirement - Rocket requires nightly (though v0.5 works on stable)
Anti-Patterns
| Anti-Pattern | Why It's Bad | Solution |
|--------------|--------------|----------|
| Using Outcome::Forward everywhere | Routes become hard to trace | Use specific error types |
| Not using request guards | Repetitive validation code | Create custom FromRequest guards |
| Mutable state without sync primitives | Data races | Use Mutex or RwLock with State |
| No database connection pooling | Resource exhaustion | Use rocket_db_pools |
| Hardcoded secrets in Rocket.toml | Security risk | Use environment variables |
Quick Troubleshooting
| Problem | Diagnosis | Fix |
|---------|-----------|-----|
| "Use of unstable library feature" | Wrong Rust version | Install nightly or use Rocket 0.5+ |
| Route not matching | Rank conflict | Specify rank attribute or reorder routes |
| Guard returns error | Validation failed | Check guard implementation logic |
| Database error on startup | Wrong connection string | Verify Rocket.toml database config |
| CORS issues | No fairing | Add CORS fairing with proper config |
Production Checklist
- [ ] Rocket.toml configured for production
- [ ] CORS fairing attached
- [ ] Custom error catchers registered
- [ ] Request guards for authentication
- [ ] Database pool configured
- [ ] Health/readiness endpoints
- [ ] Secret key set for release
Scan to join WeChat group