mirror of
https://github.com/actix/actix-website
synced 2025-08-31 00:50:20 +02:00
extractors: done-ish.
This commit is contained in:
@@ -1,18 +0,0 @@
|
||||
use actix_web::{web, HttpRequest, HttpResponse};
|
||||
|
||||
struct MyHandler {}
|
||||
struct MyInfo {}
|
||||
|
||||
// <custom-handler>
|
||||
impl<S> Handler<S> for MyHandler {
|
||||
type Result = HttpResponse;
|
||||
|
||||
/// Handle request
|
||||
fn handle(&self, req: &HttpRequest<S>) -> Self::Result {
|
||||
let params = web::Path::<(String, String)>::extract(req);
|
||||
let info = web::Json::<MyInfo>::extract(req);
|
||||
|
||||
HttpResponse::Ok().into()
|
||||
}
|
||||
}
|
||||
// </custom-handler>
|
@@ -1,5 +1,5 @@
|
||||
// <form>
|
||||
use actix_web::{web, App, Result};
|
||||
use actix_web::{web, App, HttpServer, Result};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -16,5 +16,9 @@ fn index(form: web::Form<FormData>) -> Result<String> {
|
||||
// </form>
|
||||
|
||||
pub fn main() {
|
||||
App::new().route("", web::post().to(index));
|
||||
HttpServer::new(|| App::new().route("/", web::post().to(index)))
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// <json-one>
|
||||
use actix_web::{web, App, Result};
|
||||
use actix_web::{web, App, HttpServer, Result};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -11,8 +11,12 @@ struct Info {
|
||||
fn index(info: web::Json<Info>) -> Result<String> {
|
||||
Ok(format!("Welcome {}!", info.username))
|
||||
}
|
||||
// </json-one>
|
||||
|
||||
pub fn main() {
|
||||
App::new().route("/", web::get().to(index));
|
||||
HttpServer::new(|| App::new().route("/", web::post().to(index)))
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </json-one>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// <json-two>
|
||||
use actix_web::{error, web, App, FromRequest, HttpResponse, Responder};
|
||||
use actix_web::{error, web, App, FromRequest, HttpResponse, HttpServer, Responder};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -13,22 +13,28 @@ fn index(info: web::Json<Info>) -> impl Responder {
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
App::new().service(
|
||||
web::resource("/")
|
||||
.data(
|
||||
// change json extractor configuration
|
||||
web::Json::<Info>::configure(|cfg| {
|
||||
cfg.limit(4096).error_handler(|err, _req| {
|
||||
// <- create custom error response
|
||||
error::InternalError::from_response(
|
||||
err,
|
||||
HttpResponse::Conflict().finish(),
|
||||
)
|
||||
.into()
|
||||
})
|
||||
}),
|
||||
)
|
||||
.route(web::post().to(index)),
|
||||
);
|
||||
HttpServer::new(|| {
|
||||
App::new().service(
|
||||
web::resource("/")
|
||||
.data(
|
||||
// change json extractor configuration
|
||||
web::Json::<Info>::configure(|cfg| {
|
||||
cfg.limit(4096).error_handler(|err, _req| {
|
||||
// <- create custom error response
|
||||
error::InternalError::from_response(
|
||||
err,
|
||||
HttpResponse::Conflict().finish(),
|
||||
)
|
||||
.into()
|
||||
})
|
||||
}),
|
||||
)
|
||||
.route(web::post().to(index)),
|
||||
)
|
||||
})
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </json-two>
|
||||
|
@@ -8,6 +8,7 @@ pub mod json_one;
|
||||
pub mod json_two;
|
||||
pub mod multiple;
|
||||
pub mod path_one;
|
||||
pub mod path_three;
|
||||
pub mod path_two;
|
||||
pub mod query;
|
||||
|
||||
@@ -17,13 +18,13 @@ struct MyInfo {
|
||||
id: u32,
|
||||
}
|
||||
|
||||
// <main>
|
||||
// Option 1: passed as a parameter to a handler function
|
||||
// <option-one>
|
||||
fn index(path: web::Path<(String, String)>, json: web::Json<MyInfo>) -> impl Responder {
|
||||
format!("{} {} {} {}", path.0, path.1, json.id, json.username)
|
||||
}
|
||||
// </option-one>
|
||||
|
||||
// Option 2: accessed by calling extract() on the Extractor
|
||||
// <option-two>
|
||||
fn extract(req: HttpRequest) -> impl Responder {
|
||||
let params = web::Path::<(String, String)>::extract(&req).unwrap();
|
||||
|
||||
@@ -33,7 +34,7 @@ fn extract(req: HttpRequest) -> impl Responder {
|
||||
|
||||
format!("{} {} {} {}", params.0, params.1, info.username, info.id)
|
||||
}
|
||||
// </main>
|
||||
// </option-two>
|
||||
|
||||
fn main() {
|
||||
HttpServer::new(|| {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// <multi>
|
||||
use actix_web::{web, App};
|
||||
use actix_web::{web, App, HttpServer};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -7,14 +7,23 @@ struct Info {
|
||||
username: String,
|
||||
}
|
||||
|
||||
fn index((_path, query): (web::Path<(u32, String)>, web::Query<Info>)) -> String {
|
||||
format!("Welcome {}!", query.username)
|
||||
fn index((path, query): (web::Path<(u32, String)>, web::Query<Info>)) -> String {
|
||||
format!(
|
||||
"Welcome {}, friend {}, useri {}!",
|
||||
query.username, path.1, path.0
|
||||
)
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
App::new().route(
|
||||
"/users/{userid}/{friend}", // <- define path parameters
|
||||
web::get().to(index),
|
||||
);
|
||||
HttpServer::new(|| {
|
||||
App::new().route(
|
||||
"/users/{userid}/{friend}", // <- define path parameters
|
||||
web::get().to(index),
|
||||
)
|
||||
})
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </multi>
|
||||
|
@@ -1,17 +1,23 @@
|
||||
// <path-one>
|
||||
use actix_web::{web, App, Result};
|
||||
use actix_web::{web, App, HttpServer, Result};
|
||||
|
||||
/// extract path info from "/users/{userid}/{friend}" url
|
||||
/// {userid} - - deserializes to a u32
|
||||
/// {friend} - deserializes to a String
|
||||
fn index(info: web::Path<(u32, String)>) -> Result<String> {
|
||||
Ok(format!("Welcome {}! {}", info.1, info.0))
|
||||
Ok(format!("Welcome {}, userid {}!", info.1, info.0))
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
App::new().route(
|
||||
"/users/{userid}/{friend}", // <- define path parameters
|
||||
web::get().to(index),
|
||||
);
|
||||
HttpServer::new(|| {
|
||||
App::new().route(
|
||||
"/users/{userid}/{friend}", // <- define path parameters
|
||||
web::get().to(index),
|
||||
)
|
||||
})
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </path-one>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// <path-two>
|
||||
use actix_web::{web, App, Result};
|
||||
use actix_web::{web, App, HttpServer, Result};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -14,9 +14,15 @@ fn index(info: web::Path<Info>) -> Result<String> {
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
App::new().route(
|
||||
"/users/{userid}/{friend}", // <- define path parameters
|
||||
web::get().to(index),
|
||||
);
|
||||
HttpServer::new(|| {
|
||||
App::new().route(
|
||||
"/users/{userid}/{friend}", // <- define path parameters
|
||||
web::get().to(index),
|
||||
)
|
||||
})
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </path-two>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// <query>
|
||||
use actix_web::{web, App};
|
||||
use actix_web::{web, App, HttpServer};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -11,8 +11,12 @@ struct Info {
|
||||
fn index(info: web::Query<Info>) -> String {
|
||||
format!("Welcome {}!", info.username)
|
||||
}
|
||||
// </query>
|
||||
|
||||
pub fn main() {
|
||||
App::new().route("/", web::get().to(index));
|
||||
HttpServer::new(|| App::new().route("/", web::get().to(index)))
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </query>
|
||||
|
@@ -1,8 +1,7 @@
|
||||
[package]
|
||||
name = "request-handlers"
|
||||
version = "0.7.0"
|
||||
version = "1.0.0"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
actix-web = "0.7"
|
||||
actix = "0.7"
|
||||
actix-web = "1.0"
|
||||
|
@@ -1,34 +1,37 @@
|
||||
// <arc>
|
||||
use actix_web::{dev::Handler, server, App, HttpRequest, HttpResponse};
|
||||
use actix_web::{web, App, HttpServer, Responder};
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::sync::Arc;
|
||||
|
||||
struct MyHandler(Arc<AtomicUsize>);
|
||||
#[derive(Clone)]
|
||||
struct AppState {
|
||||
count: Arc<AtomicUsize>,
|
||||
}
|
||||
|
||||
impl<S> Handler<S> for MyHandler {
|
||||
type Result = HttpResponse;
|
||||
fn show_count(data: web::Data<AppState>) -> impl Responder {
|
||||
format!("count: {}", data.count.load(Ordering::Relaxed))
|
||||
}
|
||||
|
||||
/// Handle request
|
||||
fn handle(&self, _req: &HttpRequest<S>) -> Self::Result {
|
||||
self.0.fetch_add(1, Ordering::Relaxed);
|
||||
HttpResponse::Ok().into()
|
||||
}
|
||||
fn add_one(data: web::Data<AppState>) -> impl Responder {
|
||||
data.count.fetch_add(1, Ordering::Relaxed);
|
||||
|
||||
format!("count: {}", data.count.load(Ordering::Relaxed))
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let sys = actix::System::new("example");
|
||||
let data = AppState {
|
||||
count: Arc::new(AtomicUsize::new(0)),
|
||||
};
|
||||
|
||||
let inc = Arc::new(AtomicUsize::new(0));
|
||||
|
||||
server::new(move || {
|
||||
let cloned = inc.clone();
|
||||
App::new().resource("/", move |r| r.h(MyHandler(cloned)))
|
||||
HttpServer::new(move || {
|
||||
App::new()
|
||||
.data(data.clone())
|
||||
.route("/", web::to(show_count))
|
||||
.route("/add", web::to(add_one))
|
||||
})
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.start();
|
||||
|
||||
println!("Started http server: 127.0.0.1:8088");
|
||||
let _ = sys.run();
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </arc>
|
||||
|
@@ -1,25 +1,38 @@
|
||||
mod handlers_arc;
|
||||
// <handler>
|
||||
use actix_web::{dev::Handler, server, App, HttpRequest, HttpResponse};
|
||||
pub mod handlers_arc;
|
||||
// <data>
|
||||
use actix_web::{web, App, HttpServer, Responder};
|
||||
use std::cell::Cell;
|
||||
|
||||
struct MyHandler(Cell<usize>);
|
||||
#[derive(Clone)]
|
||||
struct AppState {
|
||||
count: Cell<i32>,
|
||||
}
|
||||
|
||||
impl<S> Handler<S> for MyHandler {
|
||||
type Result = HttpResponse;
|
||||
fn show_count(data: web::Data<AppState>) -> impl Responder {
|
||||
format!("count: {}", data.count.get())
|
||||
}
|
||||
|
||||
/// Handle request
|
||||
fn handle(&self, _req: &HttpRequest<S>) -> Self::Result {
|
||||
let i = self.0.get();
|
||||
self.0.set(i + 1);
|
||||
HttpResponse::Ok().into()
|
||||
}
|
||||
fn add_one(data: web::Data<AppState>) -> impl Responder {
|
||||
let count = data.count.get();
|
||||
data.count.set(count + 1);
|
||||
|
||||
format!("count: {}", data.count.get())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
server::new(|| App::new().resource("/", |r| r.h(MyHandler(Cell::new(0))))) //use r.h() to bind handler, not the r.f()
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run();
|
||||
let data = AppState {
|
||||
count: Cell::new(0),
|
||||
};
|
||||
|
||||
HttpServer::new(move || {
|
||||
App::new()
|
||||
.data(data.clone())
|
||||
.route("/", web::to(show_count))
|
||||
.route("/add", web::to(add_one))
|
||||
})
|
||||
.bind("127.0.0.1:8088")
|
||||
.unwrap()
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
||||
// </handler>
|
||||
// </data>
|
||||
|
Reference in New Issue
Block a user