iT邦幫忙

2023 iThome 鐵人賽

DAY 30
1
Software Development

為你自己學 Ru.....st系列 第 30

[為你自己學 Rust] 網站開發框架 Actix

  • 分享至 

  • xImage
  •  

嗯...用 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,應該就能看到這個畫面:

為你自己學 Rust

「Hello World」總是這麼輕鬆 :)

但如果想要更熟悉,就是直接找個簡單的小專案,例如弄個 TODO List 試試看,前端要用 Vue 要用 React 都好,但後端就用 Rust 試試手感,我同事有寫了一篇「如何使用 Actix Web 建立 REST API」文章就是在介紹怎麼做一個 Todo List 的 API 給前端用。如果前面對 Rust 的介紹都有跟上的話,這篇文章雖然有些寫法沒看過,但應該不會太難理解。

希望這個「為你自己學 Rust」的系列文章,對想要學習 Rust 的網站工程師能有一點點點點的幫助。後續我會再把內容再做更完整的梳理,之後再放上來供大家參考 :)


上一篇
[為你自己學 Rust] 建立桌面應用程式 - Tauri
系列文
為你自己學 Ru.....st30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Dylan
iT邦新手 1 級 ‧ 2023-10-15 21:00:16

恭喜龍哥完賽!
是說關於 cargo add 的部分,是不是 cargo add actix_web,而不是 cargo add actix 呢?

以及結尾的這句是不是少了一個 字? -> 但應該不會太"難“理解

這篇文章雖然有些寫法沒看過,但應該不會太理解。

高見龍 iT邦研究生 3 級 ‧ 2023-10-15 21:42:12 檢舉

對,已修正,再次感謝提醒 :)

0
chihying
iT邦新手 4 級 ‧ 2023-10-17 12:04:56

恭喜完賽!/images/emoticon/emoticon12.gif

0
ak8893893
iT邦新手 5 級 ‧ 2024-03-04 18:31:52

感謝龍大! 受益良多!

我要留言

立即登入留言