rust實現weatherforecast的獲取天氣webapi

2023-06-05 18:00:43

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