rust實現weatherforecast的獲取天氣webapi
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


浙公網安備 33010602011771號