【tauri】为什么接口通信选择invoke而不是Axios

javascript 复制代码
#[tauri::command]
pub async fn get_req(url: String, timeout: f32) -> Value {
    log::info!("get req, url: {url}");
    let client = Client::builder().danger_accept_invalid_certs(true);
    let client = client.build().unwrap();

    let time: Duration = Duration::from_secs_f32(timeout);
    let token = TOKEN.read().unwrap().to_string();
    let lang = LANGUAGE.read().unwrap().to_string();
    let result = client
        .get(&url)
        .header("Authorization", token)
        .header("Accept-Language", lang)
        .timeout(time)
        .send()
        .await;

    convert_response(result).await
}

#[tauri::command]
pub async fn post_req(url: String, body: Value, timeout: f32) -> Value {
    let client = Client::builder().danger_accept_invalid_certs(true);
    let client = client.build().unwrap();

    let time: Duration = Duration::from_secs_f32(timeout);
    let token = TOKEN.read().unwrap().to_string();
    let lang = LANGUAGE.read().unwrap().to_string();
    let result = client
        .post(&url)
        .header("Authorization", token.clone())
        .header("Accept-Language", lang.clone())
        .json(&body)
        .timeout(time)
        .send()
        .await;
    log::info!("post url: {url}, token: {token}, lang: {lang}, result: {result:?}");
    convert_response(result).await
}

1. 可以绕过浏览器安全限制 (CORS & Mixed Content)

这是最主要的原因。Tauri 应用前端运行在 WebView 中,受限于浏览器的同源策略和安全协议。

  • CORS (跨域资源共享) : 如果后端 API 服务器没有配置允许来自 Tauri WebView 源(通常是 tauri://localhosthttp://localhost)的跨域请求,前端直接发起 Axios 请求会被浏览器拦截。通过 Rust 后端发起请求属于服务端到服务端的通信,完全不受 CORS 限制。
  • Mixed Content (混合内容 blocking) : 许多工业现场或内部测试环境使用 HTTP 协议。如果 Tauri 应用以更安全的方式运行,或者 WebView 策略较严,从"安全上下文"发起非加密的 HTTP 请求可能会被阻止。Rust 后端可以直接发起任意协议的请求。

2. 处理自签名/无效证书 (danger_accept_invalid_certs)

  • 前端限制 : 在现代浏览器中,前端 JavaScript 无法编程式地忽略 SSL 证书错误。如果服务器使用自签名证书(常见于内网 RCS/WCS 系统),前端 Axios 请求会直接失败,用户只能看到净网错误,无法通过代码绕过。
  • 后端灵活控制 : 在 Rust 中使用 reqwest 库,开发者可以显式地决定信任所有证书(.danger_accept_invalid_certs(true))。这使得应用能够无缝连接那些没有购买正式 SSL 证书的内部服务器,而无需用户在操作系统层面安装根证书或修改浏览器设置。

3. 统一认证与安全令牌管理

  • Token 隔离 :
    • 前端通过 set_token 将 Bearer Token 存储在 Rust 内存中。
    • 每次请求时,Rust 后端自动从内存读取 Token 并添加到 Header (Authorization)。
    • 优势: 这避免了 Token 暴露在前端 JavaScript 上下文中(虽然 LocalStorage 也常用,但内存存储更难被 XSS 攻击直接窃取),并且确保了所有请求(包括 SSE、上传等)都自动携带最新的认证信息,无需前端每个接口手动处理 Header。

4. 复杂网络操作的能力增强

某些操作在前端难以实现或性能较差:

  • SSE (Server-Sent Events) : 可以自己实现 sse_open_stream 使用 reqwest_eventsource。虽然前端支持 EventSource,但在 Tauri 中通过 Rust 管理长连接可以更稳定地处理重连、断开清理(destroy_client)以及与前端 Vue 组件的生命周期解耦。
  • 文件上传/下载 : upload_filedownload_rcs_logs 涉及本地文件系统交互。
    • 上传 : Rust 可以直接读取本地路径 (path 构建 multipart/form-data,避免前端需要将文件读入内存再传输的额外开销。
    • 下载 : download_rcs_logs 直接将流写入本地文件 (tokio::fs::OpenOptions),支持大文件断点续传或流式写入,而不占用前端大量内存。

总结

  1. 解决内网/测试环境常见的 HTTPS 证书问题 (通过 danger_accept_invalid_certs)。
  2. 规避 WebView 的 CORS 跨域限制
  3. 集中管理认证 Token 和网络客户端生命周期
  4. 利用 Rust 强大的异步 IO 能力处理文件流和长连接

这是一种典型的 Tauri Hybrid 架构模式:前端负责 UI 交互,后端(Rust)负责"脏活累活"(网络请求、文件系统、硬件交互),从而获得比纯 Web 应用更强的系统集成能力和更宽松的网络策略。

相关推荐
传奇开心果编程17 分钟前
【Xilem 0.4 基础语法学与练】第15课:状态管理与 memoize 性能优化
学习·rust·前端框架
qq_452396238 小时前
第三篇:《变量、类型与函数:Rust 的“基本盘”》
开发语言·后端·rust
传奇开心果编程8 小时前
【xilem0.4基础语法学与练】第22课:on_click / on_change 与手势系统的实战
学习·rust·前端框架
对象存储与RustFS12 小时前
用 Restic 把本地备份存进 RustFS:S3 兼容仓库实战
后端·rust·开源
yume_sibai13 小时前
07-Rust 异步编程完全指南(async/await + Tokio + Future + 并发原语 + 异步流)
开发语言·后端·rust
qq_4523962314 小时前
第二篇:《环境搭建与 Hello World:Cargo、rustc 与工具链》
rust
小灰灰搞电子15 小时前
Rust suppaftp 库详解:基于 FTP 客户端实战指南
开发语言·后端·rust
Ramble_Naylor15 小时前
枚举与 match:一个值只能是几种情况之一
后端·rust
编码浪子15 小时前
Rust unsafe 与 FFI 互操作生产级实战:把危险关进笼子的四道闸门
开发语言·后端·rust
传奇开心果编程1 天前
【xilem0.4基础语法学与练】第13课:Xilem 0.4 最简短代码体现“一切皆设计图“
学习·rust·前端框架