fache 0.1.351

发车工具箱
Documentation
use reqwest::{Client, Response};
use serde::{Deserialize, Serialize};
use serde_json::Value;

use crate::util::MiMa;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthToken {
    #[serde(rename = "clienTid")]
    pub client_id: String,
    #[serde(rename = "clientSecret")]
    pub client_secret: String,
    pub username: String,
    pub password: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthTokenRes {
    pub access_token: String,
    pub expires_in: u64,
    pub refresh_token: String,
    pub uid: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthTokenRefresh {
    #[serde(rename = "clienTid")]
    pub client_id: String,
    #[serde(rename = "clientSecret")]
    pub client_secret: String,
    #[serde(default = "AuthTokenRefresh::default_grant_type")]
    pub grant_type: String,
    pub refresh_token: String,
}
impl AuthTokenRefresh {
    // 设置 grant_type 的默认值
    fn default_grant_type() -> String {
        "refresh_token".to_string()
    }
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthTokenRefreshRes {
    pub access_token: String,
    pub expires_in: i64,
    pub refresh_token: String,
}
impl MiMa for AuthToken {}
impl AuthToken {
    pub async fn get(&self) -> AuthTokenRes {
        let response = Client::new()
            .post("https://cnapi.sciener.com/oauth2/token")
            .header("Content-Type", "application/x-www-form-urlencoded")
            .form(&self)
            .send()
            .await
            .expect("获取锁的 AuthToken 请求发送失败");
        // println!("{:#?}", response);
        response
            .json::<AuthTokenRes>() // 无论成功/失败,尝试解析 JSON
            .await
            .expect("解析锁的 AuthTokenRes 失败")
    }
    pub async fn refresh(&self, refresh_token: String) -> AuthTokenRefreshRes {
        let e = AuthTokenRefresh {
            client_id: self.client_id.clone(),
            client_secret: self.client_secret.clone(),
            grant_type: AuthTokenRefresh::default_grant_type(),
            refresh_token,
        };
        let response = Client::new()
            .post("https://cnapi.sciener.com/oauth2/token")
            .header("Content-Type", "application/x-www-form-urlencoded")
            .form(&e)
            .send()
            .await
            .expect("刷新锁的 AuthToken 发起请求失败");
        response
            .json::<AuthTokenRefreshRes>()
            .await
            .expect("解析 AuthTokenRefreshRes 失败")
    }
}