2020-01-23 01:08:23 +00:00
## Unreleased
2021-12-22 08:21:30 +00:00
- The default `NormalizePath` behavior now strips trailing slashes by default. This was
2021-01-05 09:51:58 +00:00
previously documented to be the case in v3 but the behavior now matches. The effect is that
routes defined with trailing slashes will become inaccessible when
2021-08-31 03:07:53 +00:00
using `NormalizePath::default()` . As such, calling `NormalizePath::default()` will log a warning.
It is advised that the `new` method be used instead.
2021-01-05 09:51:58 +00:00
2021-07-12 01:02:19 +00:00
Before: `#[get("/test/")]`
After: `#[get("/test")]`
2021-01-05 09:51:58 +00:00
Alternatively, explicitly require trailing slashes: `NormalizePath::new(TrailingSlash::Always)` .
2021-12-22 08:21:30 +00:00
- The `type Config` of `FromRequest` was removed.
2021-09-11 00:11:16 +00:00
2021-12-22 08:21:30 +00:00
- Feature flag `compress` has been split into its supported algorithm (brotli, gzip, zstd).
2021-06-19 19:21:13 +00:00
By default all compression algorithms are enabled.
To select algorithm you want to include with `middleware::Compress` use following flags:
- `compress-brotli`
- `compress-gzip`
- `compress-zstd`
If you have set in your `Cargo.toml` dedicated `actix-web` features and you still want
to have compression enabled. Please change features selection like bellow:
Before: `"compress"`
After: `"compress-brotli", "compress-gzip", "compress-zstd"`
2020-09-11 12:50:10 +00:00
## 3.0.0
2021-12-22 08:21:30 +00:00
- The return type for `ServiceRequest::app_data::<T>()` was changed from returning a `Data<T>` to
2020-09-14 21:26:03 +00:00
simply a `T` . To access a `Data<T>` use `ServiceRequest::app_data::<Data<T>>()` .
2021-12-22 08:21:30 +00:00
- Cookie handling has been offloaded to the `cookie` crate:
2020-09-14 21:26:03 +00:00
* `USERINFO_ENCODE_SET` is no longer exposed. Percent-encoding is still supported; check docs.
* Some types now require lifetime parameters.
2021-12-22 08:21:30 +00:00
- The time crate was updated to `v0.2` , a major breaking change to the time crate, which affects
2020-09-14 21:26:03 +00:00
any `actix-web` method previously expecting a time v0.1 input.
2021-12-22 08:21:30 +00:00
- Setting a cookie's SameSite property, explicitly, to `SameSite::None` will now
2020-01-23 01:08:23 +00:00
result in `SameSite=None` being sent with the response Set-Cookie header.
To create a cookie without a SameSite attribute, remove any calls setting same_site.
2020-05-17 23:42:51 +00:00
2021-12-22 08:21:30 +00:00
- actix-http support for Actors messages was moved to actix-http crate and is enabled
2020-02-27 00:34:49 +00:00
with feature `actors`
2020-09-14 21:26:03 +00:00
2021-12-22 08:21:30 +00:00
- content_length function is removed from actix-http.
2020-05-18 22:46:31 +00:00
You can set Content-Length by normally setting the response body or calling no_chunking function.
2020-01-23 01:08:23 +00:00
2021-12-22 08:21:30 +00:00
- `BodySize::Sized64` variant has been removed. `BodySize::Sized` now receives a
2020-05-17 23:42:51 +00:00
`u64` instead of a `usize` .
2021-12-22 08:21:30 +00:00
- Code that was using `path.<index>` to access a `web::Path<(A, B, C)>` s elements now needs to use
2020-07-20 23:54:26 +00:00
destructuring or `.into_inner()` . For example:
```rust
// Previously:
async fn some_route(path: web::Path< (String, String)>) -> String {
format!("Hello, {} {}", path.0, path.1)
}
// Now (this also worked before):
async fn some_route(path: web::Path< (String, String)>) -> String {
let (first_name, last_name) = path.into_inner();
format!("Hello, {} {}", first_name, last_name)
}
// Or (this wasn't previously supported):
async fn some_route(web::Path((first_name, last_name)): web::Path< (String, String)>) -> String {
format!("Hello, {} {}", first_name, last_name)
}
```
2021-12-22 08:21:30 +00:00
- `middleware::NormalizePath` can now also be configured to trim trailing slashes instead of always keeping one.
2020-08-19 11:21:52 +00:00
It will need `middleware::normalize::TrailingSlash` when being constructed with `NormalizePath::new(...)` ,
2020-09-25 11:50:59 +00:00
or for an easier migration you can replace `wrap(middleware::NormalizePath)` with `wrap(middleware::NormalizePath::new(TrailingSlash::MergeOnly))` .
2020-08-19 11:21:52 +00:00
2021-12-22 08:21:30 +00:00
- `HttpServer::maxconn` is renamed to the more expressive `HttpServer::max_connections` .
2020-09-09 08:20:54 +00:00
2021-12-22 08:21:30 +00:00
- `HttpServer::maxconnrate` is renamed to the more expressive `HttpServer::max_connection_rate` .
2020-09-09 08:20:54 +00:00
2020-09-11 12:50:10 +00:00
2019-11-21 15:34:04 +00:00
## 2.0.0
2021-12-22 08:21:30 +00:00
- `HttpServer::start()` renamed to `HttpServer::run()` . It also possible to
2019-12-22 13:12:22 +00:00
`.await` on `run` method result, in that case it awaits server exit.
2021-12-22 08:21:30 +00:00
- `App::register_data()` renamed to `App::app_data()` and accepts any type `T: 'static` .
2019-12-20 11:13:09 +00:00
Stored data is available via `HttpRequest::app_data()` method at runtime.
2021-12-22 08:21:30 +00:00
- Extractor configuration must be registered with `App::app_data()` instead of `App::data()`
2019-12-20 11:13:09 +00:00
2021-12-22 08:21:30 +00:00
- Sync handlers has been removed. `.to_async()` method has been renamed to `.to()`
2019-11-21 15:34:04 +00:00
replace `fn` with `async fn` to convert sync handler to async
2021-12-22 08:21:30 +00:00
- `actix_http_test::TestServer` moved to `actix_web::test` module. To start
2019-12-22 13:16:07 +00:00
test server use `test::start()` or `test_start_with_config()` methods
2019-11-26 10:07:39 +00:00
2021-12-22 08:21:30 +00:00
- `ResponseError` trait has been reafctored. `ResponseError::error_response()` renders
2019-12-25 16:27:30 +00:00
http response.
2021-12-22 08:21:30 +00:00
- Feature `rust-tls` renamed to `rustls`
2019-12-30 15:16:04 +00:00
instead of
2019-12-30 15:22:04 +00:00
2019-12-30 15:16:04 +00:00
```rust
actix-web = { version = "2.0.0", features = ["rust-tls"] }
```
use
```rust
actix-web = { version = "2.0.0", features = ["rustls"] }
```
2021-12-22 08:21:30 +00:00
- Feature `ssl` renamed to `openssl`
2019-12-30 15:22:04 +00:00
instead of
```rust
actix-web = { version = "2.0.0", features = ["ssl"] }
```
use
```rust
actix-web = { version = "2.0.0", features = ["openssl"] }
```
2021-12-22 08:21:30 +00:00
- `Cors` builder now requires that you call `.finish()` to construct the middleware
2019-11-21 15:34:04 +00:00
2019-06-12 09:52:48 +00:00
## 1.0.1
2021-12-22 08:21:30 +00:00
- Cors middleware has been moved to `actix-cors` crate
2019-06-15 16:20:46 +00:00
instead of
```rust
use actix_web::middleware::cors::Cors;
```
use
```rust
use actix_cors::Cors;
```
2021-12-22 08:21:30 +00:00
- Identity middleware has been moved to `actix-identity` crate
2019-06-12 09:52:48 +00:00
instead of
```rust
use actix_web::middleware::identity::{Identity, CookieIdentityPolicy, IdentityService};
```
use
```rust
use actix_identity::{Identity, CookieIdentityPolicy, IdentityService};
```
2019-06-12 10:15:06 +00:00
## 1.0.0
2019-04-06 14:39:20 +00:00
2021-12-22 08:21:30 +00:00
- Extractor configuration. In version 1.0 this is handled with the new `Data` mechanism for both setting and retrieving the configuration
2019-06-24 01:16:04 +00:00
instead of
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
```rust
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
#[derive(Default)]
struct ExtractorConfig {
config: String,
}
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
impl FromRequest for YourExtractor {
type Config = ExtractorConfig;
type Result = Result< YourExtractor , Error > ;
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
fn from_request(req: & HttpRequest, cfg: & Self::Config) -> Self::Result {
println!("use the config: {:?}", cfg.config);
...
}
}
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
App::new().resource("/route_with_config", |r| {
r.post().with_config(handler_fn, |cfg| {
cfg.0.config = "test".to_string();
})
})
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
```
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
use the HttpRequest to get the configuration like any other `Data` with `req.app_data::<C>()` and set it with the `data()` method on the `resource`
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
```rust
#[derive(Default)]
struct ExtractorConfig {
config: String,
}
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
impl FromRequest for YourExtractor {
type Error = Error;
type Future = Result< Self , Self::Error > ;
type Config = ExtractorConfig;
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
fn from_request(req: & HttpRequest, payload: & mut Payload) -> Self::Future {
let cfg = req.app_data::< ExtractorConfig > ();
println!("config data?: {:?}", cfg.unwrap().role);
...
}
}
2019-11-26 10:07:39 +00:00
2019-06-24 01:16:04 +00:00
App::new().service(
resource("/route_with_config")
.data(ExtractorConfig {
config: "test".to_string(),
})
.route(post().to(handler_fn)),
)
```
2019-11-26 10:07:39 +00:00
2021-12-22 08:21:30 +00:00
- Resource registration. 1.0 version uses generalized resource
2019-04-13 23:51:41 +00:00
registration via `.service()` method.
2019-04-11 03:47:28 +00:00
instead of
```rust
App.new().resource("/welcome", |r| r.f(welcome))
```
use App's or Scope's `.service()` method. `.service()` method accepts
object that implements `HttpServiceFactory` trait. By default
actix-web provides `Resource` and `Scope` services.
```rust
App.new().service(
web::resource("/welcome")
.route(web::get().to(welcome))
.route(web::post().to(post_handler))
```
2021-12-22 08:21:30 +00:00
- Scope registration.
2019-04-11 03:47:28 +00:00
instead of
```rust
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 and `web::scope()` as scope object factory.
```rust
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()))
);
```
2021-12-22 08:21:30 +00:00
- `.with()` , `.with_async()` registration methods have been renamed to `.to()` and `.to_async()` .
2019-04-13 23:51:41 +00:00
instead of
```rust
App.new().resource("/welcome", |r| r.with(welcome))
```
use `.to()` or `.to_async()` methods
```rust
App.new().service(web::resource("/welcome").to(welcome))
```
2021-12-22 08:21:30 +00:00
- Passing arguments to handler with extractors, multiple arguments are allowed
2019-04-13 23:51:41 +00:00
instead of
```rust
fn welcome((body, req): (Bytes, HttpRequest)) -> ... {
...
}
```
use multiple arguments
```rust
fn welcome(body: Bytes, req: HttpRequest) -> ... {
...
}
```
2021-12-22 08:21:30 +00:00
- `.f()` , `.a()` and `.h()` handler registration methods have been removed.
2019-04-13 23:51:41 +00:00
Use `.to()` for handlers and `.to_async()` for async handlers. Handler function
must use extractors.
2019-04-11 03:47:28 +00:00
instead of
```rust
App.new().resource("/welcome", |r| r.f(welcome))
```
use App's `to()` or `to_async()` methods
```rust
App.new().service(web::resource("/welcome").to(welcome))
```
2021-12-22 08:21:30 +00:00
- `HttpRequest` does not provide access to request's payload stream.
2019-05-05 05:18:02 +00:00
instead of
```rust
2019-05-05 05:18:59 +00:00
fn index(req: & HttpRequest) -> Box< Future < Item = HttpResponse, Error = Error > > {
2019-05-05 05:18:02 +00:00
req
.payload()
.from_err()
.fold((), |_, chunk| {
...
})
.map(|_| HttpResponse::Ok().finish())
.responder()
2019-05-05 05:18:59 +00:00
}
```
2019-05-05 05:18:02 +00:00
2019-05-05 05:18:59 +00:00
use `Payload` extractor
2019-05-05 05:18:02 +00:00
```rust
2019-05-05 05:18:59 +00:00
fn index(stream: web::Payload) -> impl Future< Item = HttpResponse , Error = Error > {
stream
2019-05-05 05:18:02 +00:00
.from_err()
.fold((), |_, chunk| {
...
})
.map(|_| HttpResponse::Ok().finish())
2019-05-05 05:18:59 +00:00
}
```
2019-05-05 05:18:02 +00:00
2021-12-22 08:21:30 +00:00
- `State` is now `Data` . You register Data during the App initialization process
2019-04-13 23:51:41 +00:00
and then access it from handlers either using a Data extractor or using
HttpRequest's api.
2019-04-06 14:39:20 +00:00
instead of
```rust
App.with_state(T)
```
use App's `data` method
```rust
App.new()
.data(T)
```
and either use the Data extractor within your handler
```rust
use actix_web::web::Data;
fn endpoint_handler(Data< T > )){
...
}
```
.. or access your Data element from the HttpRequest
```rust
fn endpoint_handler(req: HttpRequest) {
let data: Option< Data < T > > = req.app_data::< T > ();
}
```
2021-12-22 08:21:30 +00:00
- AsyncResponder is removed, use `.to_async()` registration method and `impl Future<>` as result type.
2019-04-06 14:39:20 +00:00
instead of
```rust
use actix_web::AsyncResponder;
fn endpoint_handler(...) -> impl Future< Item = HttpResponse , Error = Error > {
...
.responder()
}
```
.. simply omit AsyncResponder and the corresponding responder() finish method
2021-12-22 08:21:30 +00:00
- Middleware
2019-04-11 03:47:28 +00:00
instead of
```rust
let app = App::new()
.middleware(middleware::Logger::default())
```
use `.wrap()` method
```rust
let app = App::new()
.wrap(middleware::Logger::default())
.route("/index.html", web::get().to(index));
```
2021-12-22 08:21:30 +00:00
- `HttpRequest::body()` , `HttpRequest::urlencoded()` , `HttpRequest::json()` , `HttpRequest::multipart()`
2019-04-11 03:47:28 +00:00
method have been removed. Use `Bytes` , `String` , `Form` , `Json` , `Multipart` extractors instead.
2019-05-02 16:26:51 +00:00
instead of
2019-04-11 03:47:28 +00:00
```rust
fn index(req: & HttpRequest) -> Responder {
req.body()
.and_then(|body| {
...
})
}
2019-05-02 16:26:51 +00:00
```
2019-04-11 03:47:28 +00:00
2019-04-11 03:51:57 +00:00
use
2019-04-11 03:47:28 +00:00
```rust
fn index(body: Bytes) -> Responder {
...
}
```
2021-12-22 08:21:30 +00:00
- `actix_web::server` module has been removed. To start http server use `actix_web::HttpServer` type
2019-04-14 14:43:53 +00:00
2021-12-22 08:21:30 +00:00
- StaticFiles and NamedFile have been moved to a separate crate.
2019-04-11 03:47:28 +00:00
instead of `use actix_web::fs::StaticFile`
use `use actix_files::Files`
instead of `use actix_web::fs::Namedfile`
use `use actix_files::NamedFile`
2021-12-22 08:21:30 +00:00
- Multipart has been moved to a separate crate.
2019-04-11 03:47:28 +00:00
instead of `use actix_web::multipart::Multipart`
use `use actix_multipart::Multipart`
2021-12-22 08:21:30 +00:00
- Response compression is not enabled by default.
2019-04-14 14:43:53 +00:00
To enable, use `Compress` middleware, `App::new().wrap(Compress::default())` .
2019-04-11 03:51:57 +00:00
2021-12-22 08:21:30 +00:00
- Session middleware moved to actix-session crate
2019-04-11 03:51:57 +00:00
2021-12-22 08:21:30 +00:00
- Actors support have been moved to `actix-web-actors` crate
2019-04-11 03:51:57 +00:00
2021-12-22 08:21:30 +00:00
- Custom Error
2019-05-29 16:47:04 +00:00
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:
```rust
fn render_response(& self) -> HttpResponse {
self.error_response()
}
```
2019-04-06 14:39:20 +00:00
2018-11-24 13:54:11 +00:00
## 0.7.15
2021-12-22 08:21:30 +00:00
- The `' '` character is not percent decoded anymore before matching routes. If you need to use it in
2018-11-24 13:54:11 +00:00
your routes, you should use `%20` .
instead of
```rust
fn main() {
let app = App::new().resource("/my index", |r| {
r.method(http::Method::GET)
.with(index);
});
}
```
use
```rust
fn main() {
let app = App::new().resource("/my%20index", |r| {
r.method(http::Method::GET)
.with(index);
});
}
```
2021-12-22 08:21:30 +00:00
- If you used `AsyncResult::async` you need to replace it with `AsyncResult::future`
2018-12-05 08:07:59 +00:00
2018-11-24 13:54:11 +00:00
2018-08-23 16:39:11 +00:00
## 0.7.4
2018-08-17 03:29:06 +00:00
2021-12-22 08:21:30 +00:00
- `Route::with_config()` /`Route::with_async_config()` always passes configuration objects as tuple
2018-08-17 03:29:06 +00:00
even for handler with one parameter.
2018-06-02 16:01:51 +00:00
## 0.7
2021-12-22 08:21:30 +00:00
- `HttpRequest` does not implement `Stream` anymore. If you need to read request payload
2018-07-21 08:00:50 +00:00
use `HttpMessage::payload()` method.
2019-11-26 10:07:39 +00:00
2018-07-21 08:00:50 +00:00
instead of
2019-11-26 10:07:39 +00:00
2018-07-21 08:00:50 +00:00
```rust
fn index(req: HttpRequest) -> impl Responder {
req
.from_err()
.fold(...)
....
}
```
use `.payload()`
```rust
fn index(req: HttpRequest) -> impl Responder {
req
.payload() // < - get request payload stream
.from_err()
.fold(...)
....
}
```
2021-12-22 08:21:30 +00:00
- [Middleware ](https://actix.rs/actix-web/actix_web/middleware/trait.Middleware.html )
2018-07-06 09:00:14 +00:00
trait uses `&HttpRequest` instead of `&mut HttpRequest` .
2018-06-02 16:01:51 +00:00
2021-12-22 08:21:30 +00:00
- Removed `Route::with2()` and `Route::with3()` use tuple of extractors instead.
2019-11-26 10:07:39 +00:00
instead of
2018-06-02 16:28:32 +00:00
```rust
fn index(query: Query< .. > , info: Json< MyStruct ) - > impl Responder {}
```
2018-06-02 18:45:37 +00:00
use tuple of extractors and use `.with()` for registration:
2018-06-02 16:28:32 +00:00
```rust
fn index((query, json): (Query< .. > , Json< MyStruct ) ) - > impl Responder {}
```
2018-06-02 16:01:51 +00:00
2021-12-22 08:21:30 +00:00
- `Handler::handle()` uses `&self` instead of `&mut self`
2018-06-21 11:07:54 +00:00
2021-12-22 08:21:30 +00:00
- `Handler::handle()` accepts reference to `HttpRequest<_>` instead of value
2018-07-06 09:00:14 +00:00
2021-12-22 08:21:30 +00:00
- Removed deprecated `HttpServer::threads()` , use
2018-06-02 16:28:32 +00:00
[HttpServer::workers() ](https://actix.rs/actix-web/actix_web/server/struct.HttpServer.html#method.workers ) instead.
2018-06-02 16:01:51 +00:00
2021-12-22 08:21:30 +00:00
- Renamed `client::ClientConnectorError::Connector` to
2018-06-10 17:24:34 +00:00
`client::ClientConnectorError::Resolver`
2018-06-02 16:01:51 +00:00
2021-12-22 08:21:30 +00:00
- `Route::with()` does not return `ExtractorConfig` , to configure
2018-06-21 05:47:01 +00:00
extractor use `Route::with_config()`
2019-11-26 10:07:39 +00:00
instead of
2018-06-21 05:47:01 +00:00
```rust
fn main() {
let app = App::new().resource("/index.html", |r| {
r.method(http::Method::GET)
.with(index)
.limit(4096); // < - limit size of the payload
});
}
```
2019-11-26 10:07:39 +00:00
use
2018-06-21 05:47:01 +00:00
```rust
2019-11-26 10:07:39 +00:00
2018-06-21 05:47:01 +00:00
fn main() {
let app = App::new().resource("/index.html", |r| {
r.method(http::Method::GET)
.with_config(index, |cfg| { // < - register handler
cfg.limit(4096); // < - limit size of the payload
})
});
}
```
2021-12-22 08:21:30 +00:00
- `Route::with_async()` does not return `ExtractorConfig` , to configure
2018-06-21 05:47:01 +00:00
extractor use `Route::with_async_config()`
2018-06-02 16:01:51 +00:00
2018-06-02 16:25:11 +00:00
## 0.6
2018-04-26 15:01:08 +00:00
2021-12-22 08:21:30 +00:00
- `Path<T>` extractor return `ErrorNotFound` on failure instead of `ErrorBadRequest`
2018-05-09 01:48:09 +00:00
2021-12-22 08:21:30 +00:00
- `ws::Message::Close` now includes optional close reason.
2018-04-26 15:01:08 +00:00
`ws::CloseCode::Status` and `ws::CloseCode::Empty` have been removed.
2021-12-22 08:21:30 +00:00
- `HttpServer::threads()` renamed to `HttpServer::workers()` .
2018-05-01 20:15:35 +00:00
2021-12-22 08:21:30 +00:00
- `HttpServer::start_ssl()` and `HttpServer::start_tls()` deprecated.
2018-05-01 02:51:55 +00:00
Use `HttpServer::bind_ssl()` and `HttpServer::bind_tls()` instead.
2021-12-22 08:21:30 +00:00
- `HttpRequest::extensions()` returns read only reference to the request's Extension
2018-05-01 16:05:50 +00:00
`HttpRequest::extensions_mut()` returns mutable reference.
2021-12-22 08:21:30 +00:00
- Instead of
2018-05-08 20:41:04 +00:00
`use actix_web::middleware::{
CookieSessionBackend, CookieSessionError, RequestSession,
Session, SessionBackend, SessionImpl, SessionStorage};`
2019-11-26 10:07:39 +00:00
2018-05-08 20:41:04 +00:00
use `actix_web::middleware::session`
`use actix_web::middleware::session{CookieSessionBackend, CookieSessionError,
RequestSession, Session, SessionBackend, SessionImpl, SessionStorage};`
2021-12-22 08:21:30 +00:00
- `FromRequest::from_request()` accepts mutable reference to a request
2018-05-02 00:19:15 +00:00
2021-12-22 08:21:30 +00:00
- `FromRequest::Result` has to implement `Into<Reply<Self>>`
2018-05-02 00:19:15 +00:00
2021-12-22 08:21:30 +00:00
- [`Responder::respond_to()`](
2018-05-04 20:38:17 +00:00
https://actix.rs/actix-web/actix_web/trait.Responder.html#tymethod.respond_to)
is generic over `S`
2021-12-22 08:21:30 +00:00
- Use `Query` extractor instead of HttpRequest::query()`.
2018-05-02 13:28:38 +00:00
2018-05-02 13:30:06 +00:00
```rust
fn index(q: Query< HashMap < String , String > >) -> Result< .. > {
...
}
```
or
2018-05-02 13:28:38 +00:00
```rust
let q = Query::< HashMap < String , String > >::extract(req);
```
2021-12-22 08:21:30 +00:00
- Websocket operations are implemented as `WsWriter` trait.
2018-05-08 20:41:04 +00:00
you need to use `use actix_web::ws::WsWriter`
2018-04-26 15:01:08 +00:00
2018-06-02 16:25:11 +00:00
## 0.5
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `HttpResponseBuilder::body()` , `.finish()` , `.json()`
2018-04-11 23:46:21 +00:00
methods return `HttpResponse` instead of `Result<HttpResponse>`
2021-12-22 08:21:30 +00:00
- `actix_web::Method` , `actix_web::StatusCode` , `actix_web::Version`
2018-04-11 23:46:21 +00:00
moved to `actix_web::http` module
2021-12-22 08:21:30 +00:00
- `actix_web::header` moved to `actix_web::http::header`
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `NormalizePath` moved to `actix_web::http` module
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `HttpServer` moved to `actix_web::server` , added new `actix_web::server::new()` function,
2018-04-11 23:53:27 +00:00
shortcut for `actix_web::server::HttpServer::new()`
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `DefaultHeaders` middleware does not use separate builder, all builder methods moved to type itself
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `StaticFiles::new()` 's show_index parameter removed, use `show_files_listing()` method instead.
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `CookieSessionBackendBuilder` removed, all methods moved to `CookieSessionBackend` type
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `actix_web::httpcodes` module is deprecated, `HttpResponse::Ok()` , `HttpResponse::Found()` and other `HttpResponse::XXX()`
2018-04-11 23:53:27 +00:00
functions should be used instead
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `ClientRequestBuilder::body()` returns `Result<_, actix_web::Error>`
2018-04-11 23:53:27 +00:00
instead of `Result<_, http::Error>`
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `Application` renamed to a `App`
2018-04-11 23:46:21 +00:00
2021-12-22 08:21:30 +00:00
- `actix_web::Reply` , `actix_web::Resource` moved to `actix_web::dev`