学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


Tauri Http连接池

Tauri Http连接池

  • 近期有个需求是在Tauri中使用http请求,但是发现每次请求都会创建一个新的连接,这样会导致请求速度变慢,所以需要使用连接池来提高请求速度。
  • tauri内建的http库是reqwest,所以我们需要使用reqwest的连接池来实现。

reqwest

  • reqwest是一个基于hyper的http客户端库,提供了很多功能,包括连接池。
  • Client 内部维护了一个连接池,可以通过Client::new()创建一个新的连接池。不需要包在Rc或者Arc中,因为Client本身就是线程安全的。

连接池

use tauri::api::http::{Client, ClientBuilder};

pub struct Context{
    client: Client,
}

impl Context{
    pub fn new() -> Self{
        Self{
            client: ClientBuilder::new().max_redirections(1).build().expect("Unable to create http client")
        }
    }
    
    pub fn http_client(&self) -> &Client{
        &self.client
    }
}

impl Default for Context{
    fn default() -> Self{
        Self::new()
    }
}

使用

  • tauri 如何使用
#[tauri::command(rename_all = "snake_case")]
async fn test(ctx: State<'_, Context>) -> Result<()> {
    let test = ctx.http_client();
    let response = client.send(
            HttpRequestBuilder::new("GET", url)?
                .response_type(ResponseType::Binary)
        ).await;
    info!("response: {:?}", response);
    Ok(())
}

fn main() {
    let context = Context::default();
    tauri::Builder::default()
        .manage(context)
        .invoke_handler(tauri::generate_handler![test
    // ...略
  • 测试结果显示的确是使用了连接池,速度明显提高了。只创建了一个连接,后续请求都是复用这个连接。

参考