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 應用程式到資料庫:
-
Rocket.toml 中配置資料庫。
-
將請求 guard 型別和 fairing 與每個資料庫相關聯。
-
使用請求 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 保護
此外還有許多其它的新功能和功能改進,詳情檢視釋出公告。
下載地址: