一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

[Rust]Tauri開發(fā)簡(jiǎn)介:3.前后端復(fù)雜數(shù)據(jù)傳遞示例

 godxiasad 2024-10-28 發(fā)布于北京

天冷了,加衣服



傳統(tǒng)的web開發(fā)中,前后臺(tái)數(shù)據(jù)交互,一般有兩種情況:
  1. 系統(tǒng)通用的對(duì)象,例如字符串、數(shù)值、列表、布爾等類型,是需要進(jìn)行build和parse,不管是前端傳遞到后端的還是后端像前端傳輸?shù)膮?shù),都需要進(jìn)行構(gòu)建,然后進(jìn)行序列化和反序列化,但是只要涉及序列化和反序列化,可能就會(huì)帶來復(fù)雜對(duì)象解析的一些問題。
  2. 就是一些特殊的流式對(duì)象,例如前端要傳遞一個(gè)文件給后端(反之亦然),那需要把文件解析成二進(jìn)制流進(jìn)行傳輸,不過這一步通常是瀏覽器和中間件,利用HTTP的RFC1867協(xié)議通過enctype的屬性定義multipart/form-data來處理,不用你手動(dòng)寫代碼。

而我為什么要說Tauri是一個(gè)四不像的框架呢?因?yàn)檫@玩意兒作為一個(gè)桌面開發(fā),你說前后臺(tái)之間傳輸數(shù)據(jù)依然還需要走序列化和反序列這一套東西,如下所示:

我們先定義了一個(gè)結(jié)構(gòu),這個(gè)結(jié)構(gòu)里面還有一個(gè)枚舉,接下去我寫了一個(gè)方法,把他給返回給前臺(tái),這里我直接就靜態(tài)構(gòu)建了,當(dāng)然你從數(shù)據(jù)庫里面來構(gòu)造也行。

//血型,枚舉型類型
//無論是枚舉還是結(jié)構(gòu),都需要實(shí)現(xiàn)Serialize/ Deserialize,以進(jìn)行序列化和反序列,否則就會(huì)報(bào)錯(cuò)。
#[derive(Debug, Serialize, Deserialize)]
enum Blood_Type{
A,
B,
O,
AB,
Rh
}

#[derive(Debug, Serialize, Deserialize)]
struct user_info{
username: String,
nickname: String,
email:String,
age: u16,
birthday: String,
blood_type:Blood_Type,
other:Vec<f32>,

}
#[tauri::command]
fn get_user_info(username:&str)-> user_info{
user_info{
username: username.to_owned(),
nickname: "昵稱".to_owned(),
email: "abcd@abde.com".to_owned(),
age: 35,
birthday: NaiveDate::from_ymd_opt(1999, 8, 16).unwrap().to_string(),
blood_type: Blood_Type::A,
other: vec![1.5,2.0,3.3,3.1,2.6]
}
}

然后同樣寫好我們的前端和JS代碼:
<h1>Tauri 數(shù)據(jù)交互測(cè)試</h1>
<form id="query-form">
<p>用戶名:<input id="query-username" placeholder="輸入用戶名..." /></p>
<p><button type="submit">登錄</button></p>
</form>
async function get_user_info(){
let res = await invoke("get_user_info", { username: username.value});
console.log(res);
}

window.addEventListener("DOMContentLoaded", () => {
username = document.querySelector("#query-username");
vaildMsgEl = document.querySelector("#query-msg");
document.querySelector("#query-form").addEventListener("submit", (e) => {
e.preventDefault();
get_user_info();
});
});
運(yùn)行代碼,輸入用戶名,然后點(diǎn)擊F12查看前端控制臺(tái):

很明顯的發(fā)現(xiàn),后端傳輸過來的代碼,都直接build成了json對(duì)象,在前端你直接用json的方法來機(jī)型解析使用即可。

——所有,你就說,和Web開發(fā)有啥區(qū)別吧…… 

同樣的,如果要從前端像后端傳輸對(duì)象,也是一樣,所不同的是前端的JS是一個(gè)弱類型的語言,可以直接定義JSON傳遞過去,而后端需要先有一個(gè)結(jié)構(gòu)才能對(duì)接起來,如下所示:

//用JS定義了一個(gè)對(duì)象,這個(gè)對(duì)象的結(jié)構(gòu)與Rust里面的結(jié)構(gòu)一模一樣
//js 沒有枚舉型,就用對(duì)象一并模擬了,
//這里注意,Rust的枚舉型默認(rèn)序列化之后是字符串類型的,所以這Js的也得模擬成字符串的值。
async function set_user_info(){
const Blood_Type = {
A:"A",
B:"B",
O:"O",
AB:"AB",
Rh:"Rh"
}
const user_info = {
username: "godxia",
nickname: "蝦神",
email:"godxia@abcd.com",
age: 36,
birthday: "1988-01-01",
blood_type:Blood_Type.A,
other:[1.1,2.2,3,3],
}

await invoke("set_user_info", { user: user_info});
}

然后同樣在Rust里面接一下,并且打印出來:

#[tauri::command]
fn set_user_info(user:user_info)-> bool{
println!("{:?}",user);
true
}

執(zhí)行之后,結(jié)果如下:

可以看見,對(duì)象被序列化并且完整傳遞過來了。



OK,到這里了,就算了,
緣分已盡……
完全不懂前端的我真寫不下去了,
如果有興趣Tauri的同學(xué),
我們可以繼續(xù)討論一下后端Rust開發(fā)的內(nèi)容,
前端我是一個(gè)字母都寫不動(dòng)了……
……



    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产一级片内射视频免费播放 | 免费观看一区二区三区黄片| 经典欧美熟女激情综合网| 午夜福利激情性生活免费视频| 福利专区 久久精品午夜| 亚洲中文字幕视频在线观看| 在线视频三区日本精品| 人妻少妇久久中文字幕久久| 国产av一区二区三区久久不卡| 污污黄黄的成年亚洲毛片| 午夜福利激情性生活免费视频| 久久精品亚洲精品一区| 中文字幕精品一区二区年下载| 亚洲av一区二区三区精品| 国产精品刮毛视频不卡| 国产精品伦一区二区三区四季| 成人午夜在线视频观看| 黄片免费在线观看日韩| 国产大屁股喷水在线观看视频| 亚洲免费黄色高清在线观看| 好吊妞在线免费观看视频| 日韩中文字幕欧美亚洲| 亚洲中文字幕日韩在线| 国产一区日韩二区欧美| 国产精品香蕉一级免费| 国产亚洲系列91精品| 老鸭窝老鸭窝一区二区| 欧美成人欧美一级乱黄| 国产日韩综合一区在线观看| 极品少妇一区二区三区精品视频 | 少妇特黄av一区二区三区| 国产欧美日韩在线一区二区| 美女露小粉嫩91精品久久久| 国产精品尹人香蕉综合网| 成人精品欧美一级乱黄| 欧美亚洲综合另类色妞| 亚洲精品福利视频在线观看| 白白操白白在线免费观看| 九九九热在线免费视频| 久久一区内射污污内射亚洲| 国产欧洲亚洲日产一区二区|