ContentType Routing Filter in ActixWeb
Die Filterung in Resource und Router funktioniert in ActixWeb basierend auf sog. Predicates.
Eigenes ContentTypeHeader Predicate implementieren
So wird ein ContentTypeHeader
Predicate implementiert. Das Predicate sorgt dafür, dass der HTTP Header Content-Type im Request vorhanden ist um von der Resource/Route behandelt zu werden.
extern crate actix_web;
use self::actix_web::http::header::CONTENT_TYPE;
use self::actix_web::pred;
use self::actix_web::Request;
struct ContentTypeHeader;
impl<S: 'static> pred::Predicate<S> for ContentTypeHeader {
fn check(&self, req: &Request, _state: &S) -> bool {
req.headers().contains_key(http::header::CONTENT_TYPE)
}
}
Verwendet wird das neue Predicate hier:
app
.resource("/path", |rsrc| {
rsrc
.method(http::Method::POST)
.filter(ContentTypeHeader)
.with(module::handlerfunction)
})
Das HeaderPredicate
Möchte man einen bestimmten Content-Type filtern, stellt Actix das HeaderPredicate bereit. Hier ein Beispiel.
extern crate actix_web;
use self::actix_web::http::header::CONTENT_TYPE;
use self::actix_web::pred;
use self::actix_web::Request;
use self::actix_web::{http, App};
app
.resource("/path", |rsrc| {
rsrc
.method(http::Method::POST)
.filter(pred::Header(CONTENT_TYPE.as_str(), "application/json"))
.with(module::handlerfunction)
})
Die .with-Methode
Die .with-Methode ist für unterschiedliche Typen und Traits vorimplementiert. So übernimmt Actix in diesen Fällen das Parsen des Request-Bodies in den entsprechenden Typ. Das führe ich in einem neuen Artikel genauer aus.