如何在Tauri中为所有请求统一设置请求头?
在Tauri中实现全局请求头统一设置的方案
在Tauri里可以通过两种方式实现类似Electron的全局请求头配置,不用每次手动给请求加token:
方案一:前端请求库封装拦截(适合前端可控场景)
如果你继续使用superagent,不用每次重复设置请求头,可以封装一个全局实例,通过拦截器统一处理:
import superagent from 'superagent'; import { get } from '@tauri-apps/plugin-store'; // 用Tauri的store存登录信息 // 创建全局复用的superagent实例 const apiClient = superagent.agent(); // 添加全局请求拦截逻辑 apiClient.use(async (req) => { // 设置统一的User-Agent req.set('User-Agent', `userAgent ${import.meta.env.VITE_APP_VERSION}`); // 针对特定服务添加Authorization头 try { const serverUrl = await get('login.server'); const accessToken = await get('login.access_token'); if (serverUrl && accessToken && req.url.startsWith(serverUrl)) { req.set('Authorization', `Bearer ${accessToken}`); } } catch (err) { // 忽略错误 } return req; }); // 后续所有接口请求都用这个apiClient // 示例:apiClient.get('/api/user').then(res => { ... })
方案二:Tauri核心层HTTP中间件(全局拦截,更接近Electron的实现)
这种方式是在Rust后端设置全局中间件,所有通过Tauri发起的请求都会被拦截处理,和Electron的session.webRequest逻辑一致:
1. 先在src-tauri/Cargo.toml添加依赖
[dependencies] tauri = { version = "1.5", features = ["http-middleware"] } tauri-plugin-store = "1.2"
2. 修改src-tauri/src/main.rs代码
use tauri::{http::Request, http::Response, middleware::Next, Runtime}; use tauri_plugin_store::StoreBuilder; // 定义全局请求中间件 fn request_middleware<R: Runtime>(req: Request, next: Next<'_, R>) -> Response { let mut req = req; // 设置统一的User-Agent req.headers_mut().insert( "User-Agent", format!("userAgent {}", env!("CARGO_PKG_VERSION")).parse().unwrap(), ); // 从Tauri Store获取登录信息 let app_handle = req.app_handle(); let store = StoreBuilder::new(app_handle, "login.json").build().unwrap(); let server_url: Option<String> = store.get("login.server").unwrap(); let access_token: Option<String> = store.get("login.access_token").unwrap(); // 仅针对目标服务添加Authorization头 if let (Some(server), Some(token)) = (server_url, access_token) { if req.uri().to_string().starts_with(&server) && !token.is_empty() { req.headers_mut().insert( "Authorization", format!("Bearer {}", token).parse().unwrap(), ); } } next.run(req) } fn main() { tauri::Builder::default() .plugin(tauri_plugin_store::Builder::default().build()) .setup(|app| { // 注册全局HTTP中间件 app.middleware(|middleware| middleware.add(request_middleware)); Ok(()) }) .run(tauri::generate_context!()) .expect("failed to run Tauri app"); }
这个方案不管前端用superagent、fetch还是其他请求方式,只要请求走Tauri的网络栈,都会自动带上对应的请求头。
内容的提问来源于stack exchange,提问作者ADEREMI ADESADA
相关产品推荐
相关产品推荐

