在构建一个桌面应用时,几乎不可能避开网络请求。无论是获取远程配置、调用 REST API 还是上传文件,一个稳定且安全的 HTTP 客户端都是刚需。Tauri 2 并没有把这个功能塞进核心库,而是通过官方插件 @tauri-apps/plugin-http 提供了完整且受控的 HTTP 客户端支持——你既可以在 Rust 后端发送请求,也能在前端通过 JavaScript 直接调用,并且所有的请求都受到 Tauri 权限系统的严格约束。
启用 HTTP 插件
首先需要在项目中添加插件:
npm run tauri add http
这条命令会做三件事:
- 在
src-tauri/Cargo.toml中添加tauri-plugin-http依赖; - 在
src-tauri/src/lib.rs中注册插件; - 在
src-tauri/capabilities/下自动生成或更新权限配置,允许基础网络访问。
如果你需要更细粒度的 URL 范围控制,可以手动编辑权限文件(后文会讲到)。
前端直接发送请求
插件暴露了一个 fetch 函数,它的签名和浏览器原生的 fetch 非常相似,但经过了 Tauri 的安全管道:
import { fetch } from '@tauri-apps/plugin-http';
// GET 请求
const response = await fetch('https://api.example.com/data', {
method: 'GET',
headers: {
'Accept': 'application/json',
},
});
if (response.ok) {
const data = await response.json();
console.log(data);
}
// POST 请求
const postResponse = await fetch('https://api.example.com/submit', {
method: 'POST',
body: JSON.stringify({ name: 'Tauri' }),
headers: {
'Content-Type': 'application/json',
},
});
注意:这里的 fetch 和浏览器原生的最大区别在于 它不受跨域限制。因为请求实际由 Rust 后端发出,绕过了 WebView 的同源策略。这对调用第三方 API 尤其方便。
在 Rust 端发送请求
如果你想在后端处理请求逻辑(例如需要对返回数据进行二次处理,或结合系统状态),可以在 Rust 中使用插件提供的 reqwest 重新导出的客户端:
use tauri_plugin_http::reqwest;
#[tauri::command]
async fn fetch_data() -> Result<String, String> {
let client = reqwest::Client::new();
let res = client
.get("https://api.example.com/data")
.send()
.await
.map_err(|e| e.to_string())?;
let body = res.text().await.map_err(|e| e.to_string())?;
Ok(body)
}
前端调用这个命令就能间接发起请求。这种方式的好处是请求完全对前端透明,可以在 Rust 层做加密、签名、缓存等额外操作。
安全:请求作用域控制
HTTP 插件默认不允许访问任意 URL,你需要在权限文件(src-tauri/capabilities/default.json 或自定义文件)中显式声明允许的网址范围:
{
"identifier": "default",
"windows": ["main"],
"permissions": [
"http:default",
{
"identifier": "http:default",
"allow": [
{ "url": "https://api.example.com/**" },
{ "url": "https://*.mycdn.io/**" }
],
"deny": [
{ "url": "https://api.example.com/admin/**" }
]
}
]
}
- 可以用通配符
**匹配路径; deny的优先级高于allow,可以方便地屏蔽敏感子路径;- 如果请求的 URL 不在允许范围内,前端
fetch或后端请求都会直接报错,从源头杜绝了恶意请求。
实际应用建议
- 本地开发 时如果不想频繁改权限文件,可以临时打开
http:allow-everything权限,但生产环境务必收紧; - 文件上传/下载可以直接用
fetch处理ReadableStream或FormData,与浏览器用法一致; - 如果需要进度监听,可以利用
fetch返回的Response.body配合ReadableStream手动计算进度。
一句话总结:Tauri 的 HTTP 插件是一个安全加成的、跨域无感的请求工具,无论从 JavaScript 还是 Rust 端调用,都能在权限网格的守护下自由访问网络资源,同时保持应用体积的轻量。