{{ partial "header" . }}

rust's powerful actor system and most fun web framework

Type Safe

Forget about stringly typed objects, from request to response, everything has types.

Feature Rich

Actix provides a lot of features out of box. WebSockets, HTTP/2, pipelining etc.

Extensible

Easily create your own libraries that any Actix application can use.

Blazingly Fast

Actix is blazingly fast. Check yourself.

{{ highlight `extern crate actix_web; use actix_web::{server, App, HttpRequest, Responder}; fn greet(req: HttpRequest) -> impl Responder { let to = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!", to) } fn main() { server::new(|| { App::new() .resource("/", |r| r.f(greet)) .resource("/{name}", |r| r.f(greet)) }) .bind("127.0.0.1:8000") .expect("Can not bind to port 8000") .run(); }` "rust" "" }}

Flexible Responders

Handler functions in actix can return a wide range of objects that implement the Responder trait. This makes it a breeze to return consistent responses from your APIs.

{{ highlight `#[derive(Serialize)] struct Measurement { temperature: f32, } fn hello_world() -> impl Responder { "Hello World!" } fn current_temperature(_req: HttpRequest) -> impl Responder { Json(Measurement { temperature: 42.3 }) }` "rust" "" }}

Powerful Extractors

Actix comes with a powerful extractor system that extracts data from the incoming HTTP request and passes it to your view functions. Not only does this make for a convenient API but it also means that your view functions can be synchronous code and still benefit from asynchronous IO handling.

{{ highlight `#[derive(Deserialize)] struct Event { timestamp: f64, kind: String, tags: Vec, } fn capture_event(evt: Json) -> impl Responder { let id = store_event_in_db(evt.timestamp, evt.kind, evt.tags); format!("got event {}", id) }` "rust" "" }}

Easy Form Handling

Handling multipart/urlencoded form data is easy. Just define a structure that can be deserialized and actix will handle the rest.

{{ highlight `#[derive(Deserialize)] struct Register { username: String, country: String, } fn register(data: Form) -> impl Responder { format!("Hello {} from {}!", data.username, data.country) }` "rust" "" }}

Request Routing

An actix app comes with a URL routing system that lets you match on URLs and invoke individual handlers. For extra flexibility scopes can be used.

{{ highlight `fn index(req: HttpRequest) -> impl Responder { "Hello from the index page" } fn hello(req: HttpRequest) -> impl Responder { format!("Hello {}!", req.match_info().get("name").unwrap()) } fn main() { App::new() .resource("/", |r| r.method(Method::Get).with(index)) .resource("/hello/{name}", |r| r.method(Method::Get).with(hello)) .finish(); }` "rust" "" }}
{{ partial "footer" . }}