(Tauri) API 请求忽略 SSL 证书 (https)

问题描述 投票:0回答:1

我创建了一个 Tauri 应用程序,它通过 https 协议向具有所需 SSL 证书的控制器发出请求。 现在我可以忽略证书,但将来我需要支持它并能够添加它。

我使用 Tauri 和 Vite。

我要从 Electron 迁移到 Tauri,之前我使用 Axios 忽略我使用 https 代理的证书,但我不知道如何在 Tauri 中使用它。

我尝试了几种解决方案:

  1. Tauri http 模块
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。

  1. Tauri axios 适配器
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 添加忽略证书的选项,但它没有执行任何操作。

  1. Rust 后端
#[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 人,我不想在其中写入,使其异步。

我正在寻找更好的解决方案

https axios ssl-certificate vite tauri
1个回答
1
投票

您的函数是阻塞的,您需要做的就是在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()
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.