diff --git a/examples/front-page/easy-form-handling/src/main.rs b/examples/front-page/easy-form-handling/src/main.rs index 117ae99..406ef8d 100644 --- a/examples/front-page/easy-form-handling/src/main.rs +++ b/examples/front-page/easy-form-handling/src/main.rs @@ -8,10 +8,10 @@ struct Register { country: String, } -fn index() -> actix_web::Result { - Ok(HttpResponse::Ok() +fn index() -> HttpResponse { + HttpResponse::Ok() .content_type("text/html; charset=utf-8") - .body(include_str!("../static/form.html"))) + .body(include_str!("../static/form.html")) } fn register(params: web::Form) -> actix_web::Result { diff --git a/examples/front-page/easy-form-handling/static/form.html b/examples/front-page/easy-form-handling/static/form.html index 5800bde..08a2570 100644 --- a/examples/front-page/easy-form-handling/static/form.html +++ b/examples/front-page/easy-form-handling/static/form.html @@ -24,7 +24,5 @@ -
- diff --git a/examples/front-page/powerful-extractors/Cargo.toml b/examples/front-page/powerful-extractors/Cargo.toml index 3547bfc..50fe15e 100644 --- a/examples/front-page/powerful-extractors/Cargo.toml +++ b/examples/front-page/powerful-extractors/Cargo.toml @@ -5,3 +5,4 @@ edition = "2018" [dependencies] actix-web = "1.0" +serde = "1.0" diff --git a/examples/front-page/powerful-extractors/src/main.rs b/examples/front-page/powerful-extractors/src/main.rs index e7a11a9..fec60a9 100644 --- a/examples/front-page/powerful-extractors/src/main.rs +++ b/examples/front-page/powerful-extractors/src/main.rs @@ -1,3 +1,44 @@ -fn main() { - println!("Hello, world!"); +use actix_web::{web, App, HttpResponse, HttpServer}; +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize)] +struct Event { + id: Option, + timestamp: f64, + kind: String, + tags: Vec, +} + +fn store_event_in_db(timestamp: f64, kind: String, tags: Vec) -> Event { + // store item in db and get new_event + // use id to lookup item + Event { + id: Some(1), + timestamp: timestamp, + kind: kind, + tags: tags, + } +} + +fn capture_event(evt: web::Json) -> actix_web::Result { + let new_event = store_event_in_db(evt.timestamp, evt.kind.clone(), evt.tags.clone()); + Ok(HttpResponse::Ok().json(new_event)) +} + +fn index() -> HttpResponse { + HttpResponse::Ok() + .content_type("text/html; charset=utf-8") + .body(include_str!("../static/form.html")) +} + +fn main() { + HttpServer::new(|| { + App::new() + .route("/", web::get().to(index)) + .route("/event", web::post().to(capture_event)) + }) + .bind("127.0.0.1:8000") + .expect("Can not bind to port 8000") + .run() + .unwrap(); } diff --git a/examples/front-page/powerful-extractors/static/form.html b/examples/front-page/powerful-extractors/static/form.html new file mode 100644 index 0000000..d482c8c --- /dev/null +++ b/examples/front-page/powerful-extractors/static/form.html @@ -0,0 +1,36 @@ + + + + + Forms + + + +

Submit Json

+ + + + + + diff --git a/layouts/index.html b/layouts/index.html index 647536d..b85074d 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -91,16 +91,18 @@ fn current_temperature(_req: HttpRequest) -> impl Responder { your view functions can be synchronous code and still benefit from asynchronous IO handling.

- {{ highlight `#[derive(Deserialize)] + {{ highlight `#[derive(Deserialize, Serialize)] struct Event { + id: Option, 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) +fn capture_event(evt: web::Json) -> actix_web::Result { + let new_event = store_event_in_db(evt.timestamp, + evt.kind.clone(), + evt.tags.clone()); + Ok(HttpResponse::Ok().json(new_event)) }` "rust" "" }}
@@ -116,8 +118,11 @@ struct Register { country: String, } -fn register(data: Form) -> impl Responder { - format!("Hello {} from {}!", data.username, data.country) +fn register(params: web::Form) -> actix_web::Result { + Ok(HttpResponse::Ok().body(format!( + "Hello {} from {}!", + params.username, params.country + ))) }` "rust" "" }}
@@ -127,19 +132,18 @@ fn register(data: Form) -> impl Responder { URLs and invoke individual handlers. For extra flexibility, scopes can be used.

- {{ highlight `fn index(req: HttpRequest) -> impl Responder { - "Hello from the index page" + {{ highlight `fn index(_req: HttpRequest) -> HttpResponse { + HttpResponse::Ok().body("Hello from the index page!") } -fn hello(path: Path) -> impl Responder { - format!("Hello {}!", *path) +fn hello(path: web::Path) -> HttpResponse { + HttpResponse::Ok().body(format!("Hello {}!", &path)) } fn main() { App::new() - .resource("/", |r| r.method(Method::GET).with(index)) - .resource("/hello/{name}", |r| r.method(Method::GET).with(hello)) - .finish(); + .route("/", web::get().to(index)) + .route("/{name}", web::get().to(hello)); }` "rust" "" }}