Rocket 0.4 发布,改进查询、内建数据库支持、uri! 宏

  

Rocket 0.4 发布了,Rocket 是 Rust 的 Web 框架,专注于可用性、安全性和性能。

此版本向各个方向都迈进了一步,带来了各项新功能和改进,可提高开发人员的工作效率,提高应用程序的安全性和稳健性,提供新的可扩展性,并提供更新的工具链稳定性。

主要亮点包括:

Codegen 重写

rocket_codegen 包已被完全重写为使用稳定的过程宏 API,之前它使用私有的、不稳定的 rustc API。

新的 Rocket 应用导入方式:

- #![feature(plugin)]
- #![plugin(rocket_codegen)]
+ #![feature(proc_macro_hygiene, decl_macro)]

- extern crate rocket;
+ #[macro_use] extern crate rocket;

rocket_codegen 不应该直接依赖,需要从 Cargo.toml 中删除:

[dependencies]
- rocket = "0.3"
+ rocket = "0.4"
- rocket_codegen = "0.3"

类型化 URI

0.4 引入了 uri! 宏,允许开发者以健壮、类型安全和 URI 安全的方式构造 URI 路由。类型或路由参数不匹配将在编译时被捕获,并且对路由 URI 的更改会自动反映在生成的 URI 中。

下边这个路由:

#[get("/person/<name>?<age>")]
fn person(name: String, age: Option<u8>)

可以按如下方式创建 person 路由的 URI:

// with unnamed parameters, in route URI declaration order
let uri = uri!(person: "Mike Smith", 28);
assert_eq!(uri.to_string(), "/person/Mike%20Smith?age=28");

// with named parameters, order irrelevant
let uri = uri!(person: name = "Mike", age = 28);
let uri = uri!(person: age = 28, name = "Mike");
assert_eq!(uri.to_string(), "/person/Mike?age=28");

// with a specific mount-point
let uri = uri!("/api", person: name = "Mike", age = 28);
assert_eq!(uri.to_string(), "/api/person/Mike?age=28");

// with optional query parameters ignored
let uri = uri!(person: "Mike", _);
let uri = uri!(person: name = "Mike", age = _);
assert_eq!(uri.to_string(), "/person/Mike");

如果路由的 URI 以不兼容的方式更改,或者错误参数类型不对,Rocket 会在编译时通过一条消息通知:

error: person route uri expects 2 parameters but 1 was supplied
 --> examples/uri/src/main.rs:9:29
  |
9 |     uri!(person: "Mike Smith");
  |                  ^^^^^^^^^^^^
  |
  = note: expected parameters: name: String, age: Option<u8>

类型错误:

error: the trait bound u8: FromUriParam<Query, &str> is not satisfied
 --> examples/uri/src/main.rs:9:35
  |
9 |     uri!(person: age = "10", name = "Mike");
  |                        ^^^^ FromUriParam<Query, &str> is not implemented for u8
  |

数据库支持

Rocket 0.4 内建了对 ORM 无关的数据库连接池的支持,允许通过三个简单的自动化步骤,通过连接池轻松配置和连接 Rocket 应用程序到数据库:

  1. Rocket.toml 中配置数据库。

  2. 将请求 guard 类型和 fairing 与每个数据库相关联。

  3. 使用请求 guard 来检索处理程序中的连接。

改进查询

查询字符串处理已经彻底改进,解决了 Rocket 呼声最高的请求 #608。新查询处理路由语法和语义的设计考虑了以下目标:

  • 启用静态查询组件的匹配。

  • 任何情况都不存在 special-casing,而是类型驱动的流量。

  • 特定的查询 key/value 对 Ad-hoc 匹配。

  • 默认情况下是宽松解析,允许缺少参数。

  • 查询参数顺序无关匹配。

有状态的 Handler

Handler 类型已经一般可用,这用于实现新 Handler trait 的任何类型。新的 StaticFiles contrib 类型使用此功能提供比以往更容易的静态文件服务,例如,要在 /public 中访问 /static 目录中的本地文件,只需编写:

fn main() {
    rocket::ignite()
        .mount("/public", StaticFiles::from("/static"))
        .launch();
}

Responder 派生

可以使用命名字段将 Responder trait 派生为 enum 和 struct,这极大地简化了从单个处理程序返回多种类型的响应。

实时模板重载

在运行时自动重新加载更改的模板,无需重新编译,适用于所有主要平台。出于安全性和性能原因,仅在以调试模式编译应用程序时才启用该功能。

What's Next

关于下一版本 0.5,重点仍然是可用性、稳定性、安全性和性能。Rocket 0.5 的 roadmap:

  • 支持 Rust stable 

  • 异步请求处理

  • Multipart Form 支持

  • 更强的 CSRF 和 XSS 保护

此外还有许多其它的新功能和功能改进,详情查看发布公告。

下载地址:

猜你喜欢

转载自www.oschina.net/news/102574/rocketrs-0-4-released