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

栏目: 软件资讯 · 发布时间: 7年前

内容简介:Rocket 0.4 发布了,Rocket 是 Rust 的 Web 框架,专注于可用性、安全性和性能。 此版本向各个方向都迈进了一步,带来了各项新功能和改进,可提高开发人员的工作效率,提高应用程序的安全性和稳健性,提供新的可扩...

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

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

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

主要亮点包括:

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 保护

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

下载地址:


【声明】文章转载自:开源中国社区 [http://www.oschina.net]


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Haskell

Haskell

Simon Thompson / Addison-Wesley / 1999-3-16 / GBP 40.99

The second edition of Haskell: The Craft of Functional Programming is essential reading for beginners to functional programming and newcomers to the Haskell programming language. The emphasis is on th......一起来看看 《Haskell》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具