嗯...用 Rust 來做網站有搞頭嗎?
雖然 Rust 的特點是效能好並且安全性高,但如果要拿來做網站的話,老實說目前在 Rust 還沒有看到功能比較完整的網站開發框架,畢竟網站開發不是它的強項(至少現在還不是),所以開發起來的手感不會比 Ruby on Rails、Django、Laravel 或是 Next.js 這種專門的框架那麼順。但如果只是要產出 API 給前端使用的話就挺適合的,畢竟 API 的使用者目前大部份也只是透過 RESTFul API 交換 JSON 格式資料而已。
目前在 Rust 有幾款比較多人在使用的網站開發框架,其中一款是 Actix,我們就照著官網的介紹,用它來做個簡單的 API 試試看。
雖然 actix
說它是框架,但其實只是一個 Crate,雖然不一定要用全新的專案來練習,但另外開一個會比較簡單一點,所以為了簡化我就開一個全新的 Rust 專案:
$ cargo new hello-api
Created binary (application) `hello-api` package
接著你可以手動編輯 Cargo.toml
檔案,或是直接用 cargo add
指令來安裝 actix-web
套件:
$ cargo add actix-web
接著打開熟悉 src/main.rs
檔案,在一般的應用程式的進入點是 main()
,在 Actix 也差不多,只是寫法稍微有些不同。我就直接從官網的範例借來用:
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
#[get("/")]
async fn home() -> impl Responder {
HttpResponse::Ok().body("Hello world!")
}
#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {
HttpResponse::Ok().body(req_body)
}
async fn greeting() -> impl Responder {
HttpResponse::Ok().body("Hey there!")
}
以上這段內容來說,有一些像是 #[get]
或是 #[post]
之類的屬性是從 actix_web
裡借來的,光看名字大概能猜的出來這是用 HTTP GET 以及 POST 方法來存取頁面,屬性裡面可以放路徑(例如 /
以及 /echo
),像最後一個 greeting
這個沒寫的,待會可以動態的另外掛上去。
那原來的 main()
入口呢?有的,還是得寫,只是樣子稍微有些不同:
#[actix_web::main]
async fn main() -> std::io::Result<()> {
println!("Server is on http://127.0.0.1:9527");
HttpServer::new(|| {
App::new()
.service(home)
.service(echo)
.route("/hey", web::get().to(greeting))
})
.bind(("127.0.0.1", 9527))?
.run()
.await
}
大概的意思就是說會在 127.0.0.1
的 port 9527
啟動一個 HTTP Server,並且在裡面掛上剛剛寫的幾個函數。
然後我們就可以用 cargo run
來啟動整個應用程式了,第一次會需要編譯久一點。沒出錯的話,打開瀏覽器連上 http://localhost:9527
,應該就能看到這個畫面:
「Hello World」總是這麼輕鬆 :)
但如果想要更熟悉,就是直接找個簡單的小專案,例如弄個 TODO List 試試看,前端要用 Vue 要用 React 都好,但後端就用 Rust 試試手感,我同事有寫了一篇「如何使用 Actix Web 建立 REST API」文章就是在介紹怎麼做一個 Todo List 的 API 給前端用。如果前面對 Rust 的介紹都有跟上的話,這篇文章雖然有些寫法沒看過,但應該不會太難理解。
希望這個「為你自己學 Rust」的系列文章,對想要學習 Rust 的網站工程師能有一點點點點的幫助。後續我會再把內容再做更完整的梳理,之後再放上來供大家參考 :)
恭喜龍哥完賽!
是說關於 cargo add
的部分,是不是 cargo add actix_web
,而不是 cargo add actix
呢?
以及結尾的這句是不是少了一個 難
字? -> 但應該不會太"難“理解
這篇文章雖然有些寫法沒看過,但應該不會太理解。
對,已修正,再次感謝提醒 :)