Trait actix_web::FromRequest 
source · [−]pub trait FromRequest: Sized {
    type Error: Into<Error>;
    type Future: Future<Output = Result<Self, Self::Error>>;
    fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future;
    fn extract(req: &HttpRequest) -> Self::Future { ... }
}Expand description
A type that implements FromRequest is called an extractor and can extract data from
the request. Some types that implement this trait are: Json, Header, and Path.
Configuration
An extractor can be customized by injecting the corresponding configuration with one of:
Here are some built-in extractors and their corresponding configuration. Please refer to the respective documentation for details.
| Extractor | Configuration | 
|---|---|
Header | None | 
Path | PathConfig | 
Json | JsonConfig | 
Form | FormConfig | 
Query | QueryConfig | 
Bytes | PayloadConfig | 
String | PayloadConfig | 
Payload | PayloadConfig | 
Implementing An Extractor
To reduce duplicate code in handlers where extracting certain parts of a request has a common
structure, you can implement FromRequest for your own types.
Note that the request payload can only be consumed by one extractor.
Required Associated Types
Required Methods
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
Create a Self from request parts asynchronously.
Provided Methods
fn extract(req: &HttpRequest) -> Self::Future
fn extract(req: &HttpRequest) -> Self::Future
Create a Self from request head asynchronously.
This method is short for T::from_request(req, &mut Payload::None).
Implementations on Foreign Types
sourceimpl<T: 'static> FromRequest for Option<T> where
    T: FromRequest,
    T::Future: 'static, 
 
impl<T: 'static> FromRequest for Option<T> where
    T: FromRequest,
    T::Future: 'static, 
Optionally extract a field from the request
If the FromRequest for T fails, return None rather than returning an error response
Examples
use actix_web::{web, dev, App, Error, HttpRequest, FromRequest};
use actix_web::error::ErrorBadRequest;
use futures_util::future::{ok, err, Ready};
use serde::Deserialize;
use rand;
#[derive(Debug, Deserialize)]
struct Thing {
    name: String
}
impl FromRequest for Thing {
    type Error = Error;
    type Future = Ready<Result<Self, Self::Error>>;
    fn from_request(req: &HttpRequest, payload: &mut dev::Payload) -> Self::Future {
        if rand::random() {
            ok(Thing { name: "thingy".into() })
        } else {
            err(ErrorBadRequest("no luck"))
        }
    }
}
/// extract `Thing` from request
async fn index(supplied_thing: Option<Thing>) -> String {
    match supplied_thing {
        // Puns not intended
        Some(thing) => format!("Got something: {:?}", thing),
        None => format!("No thing!")
    }
}
fn main() {
    let app = App::new().service(
        web::resource("/users/:first").route(
            web::post().to(index))
    );
}type Error = Error
type Future = FromRequestOptFuture<<T as FromRequest>::Future>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<T> FromRequest for Result<T, T::Error> where
    T: FromRequest + 'static,
    T::Error: 'static,
    T::Future: 'static, 
 
impl<T> FromRequest for Result<T, T::Error> where
    T: FromRequest + 'static,
    T::Error: 'static,
    T::Future: 'static, 
Optionally extract a field from the request or extract the Error if unsuccessful
If the FromRequest for T fails, inject Err into handler rather than returning an error response
Examples
use actix_web::{web, dev, App, Result, Error, HttpRequest, FromRequest};
use actix_web::error::ErrorBadRequest;
use futures_util::future::{ok, err, Ready};
use serde::Deserialize;
use rand;
#[derive(Debug, Deserialize)]
struct Thing {
    name: String
}
impl FromRequest for Thing {
    type Error = Error;
    type Future = Ready<Result<Thing, Error>>;
    fn from_request(req: &HttpRequest, payload: &mut dev::Payload) -> Self::Future {
        if rand::random() {
            ok(Thing { name: "thingy".into() })
        } else {
            err(ErrorBadRequest("no luck"))
        }
    }
}
/// extract `Thing` from request
async fn index(supplied_thing: Result<Thing>) -> String {
    match supplied_thing {
        Ok(thing) => format!("Got thing: {:?}", thing),
        Err(e) => format!("Error extracting thing: {}", e)
    }
}
fn main() {
    let app = App::new().service(
        web::resource("/users/:first").route(web::post().to(index))
    );
}type Error = Error
type Future = FromRequestResFuture<<T as FromRequest>::Future>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static> FromRequest for (A,)
 
impl<A: FromRequest + 'static> FromRequest for (A,)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest1<A>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static> FromRequest for (A, B)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static> FromRequest for (A, B)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest2<A, B>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static> FromRequest for (A, B, C)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static> FromRequest for (A, B, C)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest3<A, B, C>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static> FromRequest for (A, B, C, D)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static> FromRequest for (A, B, C, D)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest4<A, B, C, D>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static> FromRequest for (A, B, C, D, E)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static> FromRequest for (A, B, C, D, E)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest5<A, B, C, D, E>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static> FromRequest for (A, B, C, D, E, F)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static> FromRequest for (A, B, C, D, E, F)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest6<A, B, C, D, E, F>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest7<A, B, C, D, E, F, G>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static, H: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G, H)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static, H: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G, H)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest8<A, B, C, D, E, F, G, H>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static, H: FromRequest + 'static, I: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G, H, I)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static, H: FromRequest + 'static, I: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G, H, I)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest9<A, B, C, D, E, F, G, H, I>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static, H: FromRequest + 'static, I: FromRequest + 'static, J: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G, H, I, J)
 
impl<A: FromRequest + 'static, B: FromRequest + 'static, C: FromRequest + 'static, D: FromRequest + 'static, E: FromRequest + 'static, F: FromRequest + 'static, G: FromRequest + 'static, H: FromRequest + 'static, I: FromRequest + 'static, J: FromRequest + 'static> FromRequest for (A, B, C, D, E, F, G, H, I, J)
FromRequest implementation for tuple
type Error = Error
type Future = TupleFromRequest10<A, B, C, D, E, F, G, H, I, J>
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future
sourceimpl FromRequest for String
 
impl FromRequest for String
Extract text information from a request’s body.
Text extractor automatically decode body according to the request’s charset.
Use PayloadConfig to configure extraction process.
Examples
use actix_web::{post, web, FromRequest};
// extract text data from request
#[post("/")]
async fn index(text: String) -> String {
    format!("Body {}!", text)
}Implementors
sourceimpl FromRequest for ConnectionInfo
 
impl FromRequest for ConnectionInfo
type Error = Infallible
type Future = Ready<Result<ConnectionInfo, <ConnectionInfo as FromRequest>::Error>>
sourceimpl FromRequest for PeerAddr
 
impl FromRequest for PeerAddr
sourceimpl FromRequest for Method
 
impl FromRequest for Method
Extract the request’s method.
Examples
use actix_web::{http::Method, web, App, Responder};
async fn handler(method: Method) -> impl Responder {
    format!("Request method: {}", method)
}
let app = App::new().default_service(web::to(handler));type Error = Infallible
type Future = Ready<Result<Method, <Method as FromRequest>::Error>>
sourceimpl FromRequest for Uri
 
impl FromRequest for Uri
Extract the request’s URI.
Examples
use actix_web::{http::Uri, web, App, Responder};
async fn handler(uri: Uri) -> impl Responder {
    format!("Requested path: {}", uri.path())
}
let app = App::new().default_service(web::to(handler));type Error = Infallible
type Future = Ready<Result<Uri, <Uri as FromRequest>::Error>>
sourceimpl FromRequest for Bytes
 
impl FromRequest for Bytes
Extract binary data from a request’s payload.
Collects request payload stream into a Bytes instance.
Use PayloadConfig to configure extraction process.
Examples
use actix_web::{post, web};
/// extract binary data from request
#[post("/")]
async fn index(body: web::Bytes) -> String {
    format!("Body {:?}!", body)
}sourceimpl FromRequest for HttpRequest
 
impl FromRequest for HttpRequest
It is possible to get HttpRequest as an extractor handler parameter
Examples
use actix_web::{web, App, HttpRequest};
use serde::Deserialize;
/// extract `Thing` from request
async fn index(req: HttpRequest) -> String {
   format!("Got thing: {:?}", req)
}
fn main() {
    let app = App::new().service(
        web::resource("/users/{first}").route(
            web::get().to(index))
    );
}sourceimpl FromRequest for Payload
 
impl FromRequest for Payload
See here for example of usage as an extractor.
sourceimpl<L, R> FromRequest for Either<L, R> where
    L: FromRequest + 'static,
    R: FromRequest + 'static, 
 
impl<L, R> FromRequest for Either<L, R> where
    L: FromRequest + 'static,
    R: FromRequest + 'static, 
See here for example of usage as an extractor.
type Error = EitherExtractError<<L as FromRequest>::Error, <R as FromRequest>::Error>
type Future = EitherExtractFut<L, R>
sourceimpl<T> FromRequest for Form<T> where
    T: DeserializeOwned + 'static, 
 
impl<T> FromRequest for Form<T> where
    T: DeserializeOwned + 'static, 
See here for example of usage as an extractor.
sourceimpl<T> FromRequest for Header<T> where
    T: ParseHeader, 
 
impl<T> FromRequest for Header<T> where
    T: ParseHeader, 
type Error = ParseError
type Future = Ready<Result<Header<T>, <Header<T> as FromRequest>::Error>>
sourceimpl<T> FromRequest for Path<T> where
    T: DeserializeOwned, 
 
impl<T> FromRequest for Path<T> where
    T: DeserializeOwned, 
See here for example of usage as an extractor.
sourceimpl<T: DeserializeOwned> FromRequest for Json<T>
 
impl<T: DeserializeOwned> FromRequest for Json<T>
See here for example of usage as an extractor.
sourceimpl<T: DeserializeOwned> FromRequest for Query<T>
 
impl<T: DeserializeOwned> FromRequest for Query<T>
See here for example of usage as an extractor.
