Actix Web Guide

Quick Start

// Cargo.toml // actix-web = "4" // serde = { version = "1", features = ["derive"] } // tokio = { version = "1", features = ["full"] } use actix_web::{web, App, HttpServer, HttpResponse, Responder}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct User { id: u32, name: String } async fn get_users() -> impl Responder { let users = vec![ User { id: 1, name: "Alice".into() }, ]; HttpResponse::Ok().json(users) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new() .route("/users", web::get().to(get_users)) .route("/users/{id}", web::get().to(get_user)) }) .bind("0.0.0.0:8080")? .run() .await }

Extractors

// Path params async fn get_user(path: web::Path<u32>) -> impl Responder { let id = path.into_inner(); HttpResponse::Ok().json(User { id, name: "Alice".into() }) } // Query params #[derive(Deserialize)] struct Pagination { page: u32, limit: u32 } async fn list(query: web::Query<Pagination>) -> impl Responder { HttpResponse::Ok().json(query.0) } // JSON body async fn create(body: web::Json<User>) -> impl Responder { HttpResponse::Created().json(body.0) } // App state async fn with_state(data: web::Data<AppState>) -> impl Responder { HttpResponse::Ok().body(data.version.clone()) }