rust用來寫webapi可能有點大材小用,但是作為入門學習應該說是不錯的選擇。
cargo new webapi建立一個webapi專案,在src下面新建handler資料夾和models資料夾。
在models資料夾下面建立一個mod.rs和weatherforecast.rs檔案。
weatherforecast.rs檔案新建我們需要的WeatherForecast類,附上Serialize,Deserialize介面(trait)實現。
use chrono::NaiveDate; use serde::{Serialize, Deserialize}; #[derive(Debug,Serialize,Deserialize)] pub struct WeatherForecast{ pub date:NaiveDate, pub temperature_c:i32, pub temperature_f:i32, pub summary:String }
mod.rs檔案作為管理模組,實體類需要匯入,有多少實體類都可以放進去,後續就方便從這個模組中匯出需要的類。
當然rust的webapi需要匯入web開發需要的庫,以及專案中需要的庫,看名字就大概的猜到是什麼作用了。
有了實體類,下面就寫下get介面的實現,作為一個webapi架子,只用記憶體做儲存
同樣在handlers資料夾下面新建mod.rs和weatherforecast.rs
handlers下面的weatherforecast.rs程式碼如下
use crate::models::weatherforecast::WeatherForecast; use actix_web::{get,HttpResponse,Responder}; use chrono::{Duration, Utc}; use rand::Rng; #[get("/getweatherforecast")] pub async fn getweatherforecast()->impl Responder{ let mut rng = rand::thread_rng(); let summaries: Vec<&str> = vec!["Sunny","Cloudy","Rainy","Stormy"]; let weather_forecasts:Vec<WeatherForecast> = (1..=5).map(|index|{ let date = Utc::now().date_naive() + Duration::days(index); let temperature_c = rng.gen_range(-20..=55); let summary = summaries[rng.gen_range(0..summaries.len())].to_string(); let temperature_f = 32 + (temperature_c / 5 * 9); WeatherForecast{ date, temperature_c, temperature_f, summary:summary } }).collect(); HttpResponse::Ok().json(weather_forecasts) }
handlers通過use crate::models::weatherforecast::WeatherForecast參照了models的模組,所以在main.rs中需要提前引入,程式碼如下:
#[path = "models/mod.rs"] mod models; #[path = "handlers/mod.rs"] mod handlers; use actix_web::{App,HttpServer}; use handlers::*; #[actix_web::main] async fn main()->std::io::Result<()> { HttpServer::new(||{ App::new() .service(weatherforecast::getweatherforecast) }).bind("127.0.0.1:8088")?.run().await }
到這裡程式碼就寫完了,下面執行一下看看效果:存取地址 127.0.0.1:8088/getweatherforecast
範例程式碼如下:
rust/webapi at main · liuzhixin405/rust · GitHub