Trait ntex::web::FromRequest[][src]

pub trait FromRequest<Err>: Sized {
    type 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

Trait implemented by types that can be extracted from request.

Types that implement this trait can be used with Route handlers.

Associated Types

The associated error which can be returned.

Future that resolves to a Self

Required methods

Convert request to a Self

Provided methods

Convert request to a Self

This method uses Payload::None as payload stream.

Implementations on Foreign Types

Optionally extract a field from the request

If the FromRequest for T fails, return None rather than returning an error response

Example
use ntex::{http, util::Ready};
use ntex::web::{self, error, App, HttpRequest, FromRequest, DefaultError};
use rand;

#[derive(Debug, serde::Deserialize)]
struct Thing {
    name: String
}

impl<Err> FromRequest<Err> for Thing {
    type Error = error::Error;
    type Future = Ready<Self, Self::Error>;

    fn from_request(req: &HttpRequest, payload: &mut http::Payload) -> Self::Future {
        if rand::random() {
            Ready::Ok(Thing { name: "thingy".into() })
        } else {
            Ready::Err(error::ErrorBadRequest("no luck").into())
        }
    }
}

/// 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))
    );
}

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

Example
use ntex::{http, util::Ready};
use ntex::web::{self, error, App, HttpRequest, FromRequest};
use rand;

#[derive(Debug, serde::Deserialize)]
struct Thing {
    name: String
}

impl<Err> FromRequest<Err> for Thing {
    type Error = error::Error;
    type Future = Ready<Thing, Self::Error>;

    fn from_request(req: &HttpRequest, payload: &mut http::Payload) -> Self::Future {
        if rand::random() {
            Ready::Ok(Thing { name: "thingy".into() })
        } else {
            Ready::Err(error::ErrorBadRequest("no luck").into())
        }
    }
}

/// extract `Thing` from request
async fn index(supplied_thing: Result<Thing, error::Error>) -> 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))
    );
}

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

FromRequest implementation for a tuple

Extract text information from a request’s body.

Text extractor automatically decode body according to the request’s charset.

PayloadConfig allows to configure extraction process.

Example
use ntex::web::{self, App, FromRequest};

/// extract text data from request
async fn index(text: String) -> String {
    format!("Body {}!", text)
}

fn main() {
    let app = App::new().service(
        web::resource("/index.html")
            .app_data(
                web::types::PayloadConfig::new(4096)  // <- limit size of the payload
            )
            .route(web::get().to(index))  // <- register handler with extractor params
    );
}

Implementors

Request binary data from a request’s payload.

Loads request’s payload and construct Bytes instance.

PayloadConfig allows to configure extraction process.

Example
use ntex::{web, util::Bytes};

/// extract binary data from request
async fn index(body: Bytes) -> String {
    format!("Body {:?}!", body)
}

fn main() {
    let app = web::App::new().service(
        web::resource("/index.html").route(
            web::get().to(index))
    );
}

It is possible to get HttpRequest as an extractor handler parameter

Example
use ntex::web::{self, App, HttpRequest};

/// extract `HttpRequest` 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))
    );
}

Get request’s payload stream

Example
use futures::{Future, Stream};
use ntex::util::BytesMut;
use ntex::web::{self, error, App, Error, HttpResponse};

/// extract binary data from request
async fn index(mut body: web::types::Payload) -> Result<HttpResponse, error::PayloadError>
{
    let mut bytes = BytesMut::new();
    while let Some(item) = ntex::util::next(&mut body).await {
        bytes.extend_from_slice(&item?);
    }

    format!("Body {:?}!", bytes);
    Ok(HttpResponse::Ok().finish())
}

fn main() {
    let app = App::new().service(
        web::resource("/index.html").route(
            web::get().to(index))
    );
}

Extract typed information from the request’s query.

Example
use ntex::web;

#[derive(Debug, serde::Deserialize)]
pub enum ResponseType {
   Token,
   Code
}

#[derive(serde::Deserialize)]
pub struct AuthRequest {
   id: u64,
   response_type: ResponseType,
}

// Use `Query` extractor for query information.
// This handler get called only if request's query contains `username` field
// The correct request for this handler would be `/index.html?id=64&response_type=Code"`
async fn index(info: web::types::Query<AuthRequest>) -> String {
    format!("Authorization request for client with id={} and type={:?}!", info.id, info.response_type)
}

fn main() {
    let app = web::App::new().service(
       web::resource("/index.html")
           .route(web::get().to(index))); // <- use `Query` extractor
}

Json extractor. Allow to extract typed information from request’s payload.

To extract typed information from request’s body, the type T must implement the Deserialize trait from serde.

JsonConfig allows to configure extraction process.

Example
use ntex::web;

#[derive(serde::Deserialize)]
struct Info {
    username: String,
}

/// deserialize `Info` from request's body
async fn index(info: web::types::Json<Info>) -> String {
    format!("Welcome {}!", info.username)
}

fn main() {
    let app = web::App::new().service(
        web::resource("/index.html").route(
           web::post().to(index))
    );
}

Extract typed information from the request’s path.

Example
use ntex::web;

/// extract path info from "/{username}/{count}/index.html" url
/// {username} - deserializes to a String
/// {count} -  - deserializes to a u32
async fn index(info: web::types::Path<(String, u32)>) -> String {
    format!("Welcome {}! {}", info.0, info.1)
}

fn main() {
    let app = web::App::new().service(
        web::resource("/{username}/{count}/index.html") // <- define path parameters
             .route(web::get().to(index)) // <- register handler with `Path` extractor
    );
}

It is possible to extract path information to a specific type that implements Deserialize trait from serde.

use ntex::web;

#[derive(serde::Deserialize)]
struct Info {
    username: String,
}

/// extract `Info` from a path using serde
async fn index(info: web::types::Path<Info>) -> Result<String, web::Error> {
    Ok(format!("Welcome {}!", info.username))
}

fn main() {
    let app = web::App::new().service(
        web::resource("/{username}/index.html") // <- define path parameters
             .route(web::get().to(index)) // <- use handler with Path` extractor
    );
}