学无止境

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


Tauri如何与actix Web结合

文件目录

│   ├── src
│   │   ├── main.rs
│   │   └── server
│   │       └── mod.rs

Tauri如何与actix Web结合

  • Tauri是一个用于构建现代桌面应用程序的工具包,它使用web技术来构建应用程序,同时提供了一些原生API来访问系统资源。
  • actix-web是一个基于Rust的Web框架,它提供了高性能的HTTP服务,可以用于构建Web应用程序。
  • 本文将介绍如何将Tauri与actix-web结合,以实现一个桌面应用程序。

actix-web

  • actix-web是一个基于Rust的Web框架,它提供了高性能的HTTP服务,可以用于构建Web应用程序。
  • actix-web使用actor模型来处理HTTP请求,每个请求都会被封装成一个actor,然后由系统调度执行。
  • 在server模块中创建一个新的actix-web应用程序。
use actix_web::{get, middleware, web, App, HttpServer};
use tauri::{AppHandle, Manager};

pub struct TauriAppState {
    app: AppHandle,
}

#[get("/")]
pub async fn handle(app: web::Data<TauriAppState>) -> actix_web::Result<String> {
    let main_window = app.app.get_window("main").unwrap();
    main_window.show().unwrap();
    main_window.set_focus().unwrap();
    Ok("".to_string())
}

#[actix_web::main]
pub async fn init(_app: AppHandle) -> std::io::Result<()> {
    let tauri_app = web::Data::new(TauriAppState {
        app: _app,
    });
    HttpServer::new(move || {
        App::new()
            .app_data(tauri_app.clone())
            .wrap(middleware::Logger::default())
            .service(handle)
    })
    .bind(("127.0.0.1", 3001))?
    .run()
    .await
}

actix-web与tauri结合

  • 在main.rs中启动actix-web应用程序。
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

mod server;
use std::{thread, vec};

use tauri::{CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem};
use tauri_plugin_autostart::MacosLauncher;

// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! You've been greeted from Rust!", name)
}

fn main() {
    tauri::Builder::default()
    .setup(|app| {
        let app_handle = app.handle();
        let boxed_app_handle = Box::new(app_handle);
        thread::spawn(move || {
            server::init(*boxed_app_handle).expect("failed to start actix server");
        });
        Ok(())
    })
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application")
}

参考