我创建了一个 Tauri 应用程序,它通过 https 协议向具有所需 SSL 证书的控制器发出请求。 现在我可以忽略证书,但将来我需要支持它并能够添加它。
我使用 Tauri 和 Vite。
我要从 Electron 迁移到 Tauri,之前我使用 Axios 忽略我使用 https 代理的证书,但我不知道如何在 Tauri 中使用它。
我尝试了几种解决方案:
import { getClient } from '@tauri-apps/api/http'; const client = await getClient(); const response = await client.delete('https://192.168.100.100/');
它抛出一个错误:
Uncaught (in promise) Network Error: Tls Error
我怀疑有错误,因为它是一个 http 模块,而不是 https。
import axios from 'axios';
import axiosTauriAdapter from 'axios-tauri-adapter';
const client = axios.create({ adapter: axiosTauriAdapter });
document.getElementById("get-ata").addEventListener("click", api_get_ata)
function api_get_ata(){
axios.get("https://192.168.100.100/")
.then(function (response){
console.log(response)
})
.catch(function (error) {
console.log("Error: ", error);
});
}
它还会引发错误:
GET https://192.168.100.100/ net::ERR_CERT_AUTHORITY_INVALID
axios 也有类似的错误。
我尝试向 axios 添加忽略证书的选项,但它没有执行任何操作。
#[tauri::command]
fn api_post_req(url: &str, auth: &str, body: String, timeout: f32) -> String
{
let client = Client::builder()
.danger_accept_invalid_certs(true)
.build()
.unwrap();
let time: Duration = Duration::from_secs_f32(timeout);
let result = client
.post(url)
.header("authorization", auth)
.body(body)
.timeout(time)
.send();
return convert_response(result)
}
fn convert_response(result: Result<Response, Error>) -> String {
return match result {
Ok(response) => {
match response.text() {
Ok(text) => {
text
}
Err(err) => {
"Something messed up! but result was ok. Rust error:".to_string() + err.to_string().as_str()
}
}
},
Err(error) => {
"Rust error: ".to_string() + error.to_string().as_str()
}
}
}
它可以工作,但不是异步的,当我每 300 毫秒发出一个请求时,整个应用程序就会冻结。我不是 Rust 人,我不想在其中写入,使其异步。
我正在寻找更好的解决方案
您的函数是阻塞的,您需要做的就是在async模式下运行它,因此HTTP等待将在单独的闭包中发生。
我还会使用 reqwest 库而不是现有的 HTTP 客户端,因为它可以让您更灵活地管理请求。
// see "async" keyword below
#[tauri::command]
async fn api_post_req(url: &str, auth: &str, body: String, timeout: f32) -> String
{
let client = Client::builder()
.danger_accept_invalid_certs(true)
.build()
.unwrap();
let time: Duration = Duration::from_secs_f32(timeout);
let result = client
.post(url)
.header("authorization", auth)
.body(body)
.timeout(time)
.send();
return convert_response(result)
}
fn convert_response(result: Result<Response, Error>) -> String {
return match result {
Ok(response) => {
match response.text() {
Ok(text) => {
text
}
Err(err) => {
"Something messed up! but result was ok. Rust error:".to_string() + err.to_string().as_str()
}
}
},
Err(error) => {
"Rust error: ".to_string() + error.to_string().as_str()
}
}
}