ContentType Routing Filter in ActixWeb

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.