7.6 KiB
1.0.1
-
Cors middleware has been moved to
actix-corscrateinstead of
use actix_web::middleware::cors::Cors;use
use actix_cors::Cors; -
Identity middleware has been moved to
actix-identitycrateinstead of
use actix_web::middleware::identity::{Identity, CookieIdentityPolicy, IdentityService};use
use actix_identity::{Identity, CookieIdentityPolicy, IdentityService};
1.0.0
-
Extractor configuration. In version 1.0 this is handled with the new
Datamechanism for both setting and retrieving the configurationinstead of
#[derive(Default)] struct ExtractorConfig { config: String, } impl FromRequest for YourExtractor { type Config = ExtractorConfig; type Result = Result<YourExtractor, Error>; fn from_request(req: &HttpRequest, cfg: &Self::Config) -> Self::Result { println!("use the config: {:?}", cfg.config); ... } } App::new().resource("/route_with_config", |r| { r.post().with_config(handler_fn, |cfg| { cfg.0.config = "test".to_string(); }) })use the HttpRequest to get the configuration like any other
Datawithreq.app_data::<C>()and set it with thedata()method on theresource#[derive(Default)] struct ExtractorConfig { config: String, } impl FromRequest for YourExtractor { type Error = Error; type Future = Result<Self, Self::Error>; type Config = ExtractorConfig; fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future { let cfg = req.app_data::<ExtractorConfig>(); println!("config data?: {:?}", cfg.unwrap().role); ... } } App::new().service( resource("/route_with_config") .data(ExtractorConfig { config: "test".to_string(), }) .route(post().to(handler_fn)), ) -
Resource registration. 1.0 version uses generalized resource registration via
.service()method.instead of
App.new().resource("/welcome", |r| r.f(welcome))use App's or Scope's
.service()method..service()method accepts object that implementsHttpServiceFactorytrait. By default actix-web providesResourceandScopeservices.App.new().service( web::resource("/welcome") .route(web::get().to(welcome)) .route(web::post().to(post_handler)) -
Scope registration.
instead of
let app = App::new().scope("/{project_id}", |scope| { scope .resource("/path1", |r| r.f(|_| HttpResponse::Ok())) .resource("/path2", |r| r.f(|_| HttpResponse::Ok())) .resource("/path3", |r| r.f(|_| HttpResponse::MethodNotAllowed())) });use
.service()for registration andweb::scope()as scope object factory.let app = App::new().service( web::scope("/{project_id}") .service(web::resource("/path1").to(|| HttpResponse::Ok())) .service(web::resource("/path2").to(|| HttpResponse::Ok())) .service(web::resource("/path3").to(|| HttpResponse::MethodNotAllowed())) ); -
.with(),.with_async()registration methods have been renamed to.to()and.to_async().instead of
App.new().resource("/welcome", |r| r.with(welcome))use
.to()or.to_async()methodsApp.new().service(web::resource("/welcome").to(welcome)) -
Passing arguments to handler with extractors, multiple arguments are allowed
instead of
fn welcome((body, req): (Bytes, HttpRequest)) -> ... { ... }use multiple arguments
fn welcome(body: Bytes, req: HttpRequest) -> ... { ... } -
.f(),.a()and.h()handler registration methods have been removed. Use.to()for handlers and.to_async()for async handlers. Handler function must use extractors.instead of
App.new().resource("/welcome", |r| r.f(welcome))use App's
to()orto_async()methodsApp.new().service(web::resource("/welcome").to(welcome)) -
HttpRequestdoes not provide access to request's payload stream.instead of
fn index(req: &HttpRequest) -> Box<Future<Item=HttpResponse, Error=Error>> { req .payload() .from_err() .fold((), |_, chunk| { ... }) .map(|_| HttpResponse::Ok().finish()) .responder() }use
Payloadextractorfn index(stream: web::Payload) -> impl Future<Item=HttpResponse, Error=Error> { stream .from_err() .fold((), |_, chunk| { ... }) .map(|_| HttpResponse::Ok().finish()) } -
Stateis nowData. You register Data during the App initialization process and then access it from handlers either using a Data extractor or using HttpRequest's api.instead of
App.with_state(T)use App's
datamethodApp.new() .data(T)and either use the Data extractor within your handler
use actix_web::web::Data; fn endpoint_handler(Data<T>)){ ... }.. or access your Data element from the HttpRequest
fn endpoint_handler(req: HttpRequest) { let data: Option<Data<T>> = req.app_data::<T>(); } -
AsyncResponder is removed, use
.to_async()registration method andimpl Future<>as result type.instead of
use actix_web::AsyncResponder; fn endpoint_handler(...) -> impl Future<Item=HttpResponse, Error=Error>{ ... .responder() }.. simply omit AsyncResponder and the corresponding responder() finish method
-
Middleware
instead of
let app = App::new() .middleware(middleware::Logger::default())use
.wrap()methodlet app = App::new() .wrap(middleware::Logger::default()) .route("/index.html", web::get().to(index)); -
HttpRequest::body(),HttpRequest::urlencoded(),HttpRequest::json(),HttpRequest::multipart()method have been removed. UseBytes,String,Form,Json,Multipartextractors instead.instead of
fn index(req: &HttpRequest) -> Responder { req.body() .and_then(|body| { ... }) }use
fn index(body: Bytes) -> Responder { ... } -
actix_web::servermodule has been removed. To start http server useactix_web::HttpServertype -
StaticFiles and NamedFile have been moved to a separate crate.
instead of
use actix_web::fs::StaticFileuse
use actix_files::Filesinstead of
use actix_web::fs::Namedfileuse
use actix_files::NamedFile -
Multipart has been moved to a separate crate.
instead of
use actix_web::multipart::Multipartuse
use actix_multipart::Multipart -
Response compression is not enabled by default. To enable, use
Compressmiddleware,App::new().wrap(Compress::default()). -
Session middleware moved to actix-session crate
-
Actors support have been moved to
actix-web-actorscrate -
Custom Error
Instead of error_response method alone, ResponseError now provides two methods: error_response and render_response respectively. Where, error_response creates the error response and render_response returns the error response to the caller.
Simplest migration from 0.7 to 1.0 shall include below method to the custom implementation of ResponseError:
fn render_response(&self) -> HttpResponse { self.error_response() }