< 返回版块

zhouchongzxc 发表于 2023-01-28 21:30

背景:

通过actix创建一个http服务器,将接收过来的url通过tauri事件传递给前端,前端处理完成后将结果通过invoke传回tauri,再传回给actix,输出给浏览器。

目前tauri事件、invoke和http服务器都已打通,但是url不知道如何传递给前端。换 句话说,fn start_http_server(port: i64, app: tauri::AppHandle) -> String {}中的app不知道如何传递给actix中的方法,有大神可以给个思路吗?

附上目前的代码:

main.rs

#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")]

mod http;
use tauri::Manager;
use std::thread;

#[derive(Clone, serde::Serialize, serde::Deserialize)]
struct Person {
    name: String,
    age: i64,
    old_name: String,
}

#[tauri::command]
fn start_http_server(port: i64, app: tauri::AppHandle) -> String {
    thread::spawn(move || {
        match http::main(port, app) { // 这里把 app 传递过去,却不知道怎么 调用
            Ok(_) => {}
            Err(_) => {}
        }
    });

    format!("start http server success")
}

fn main() {
    tauri::Builder
        ::default()
        .invoke_handler(tauri::generate_handler![start_http_server])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

http.rs

use actix_web::{ web, App, HttpResponse, HttpServer, Responder, HttpRequest };

async fn get_url(req: HttpRequest) -> impl Responder {
    // 这里面怎么调用 main.rs 传递过来的 app,以便能够调用 tauri 的 app.emit_all 方法?
    HttpResponse::Ok().body(format!("{}", req.uri()))
}

#[actix_web::main]
pub async fn main(port: i64, app: tauri::AppHandle) -> std::io::Result<()> { // 这个 app 怎么传递给 get_url 方法呀?
    HttpServer::new(|| { App::new().default_service(web::route().to(get_url)) })
        .bind(format!("127.0.0.1:{}", port))?
        .run().await
}

评论区

写评论
Krysme 2023-01-31 14:23

App里面支持放Data

App::new().service(
    web::resource("/")
        .app_data(3usize)
        .app_data(web::Data::new(MyData { count: Default::default() }))
        .route(web::get().to(handler))
);

这个代码样例在文档上面有 doc[https://docs.rs/actix-web/latest/actix_web/struct.App.html#method.app_data]

shellfly 2023-01-28 23:20

看起来需要一个closure来生成一个handler,这样就可以在handler中使用app这个变量,最近刚写了一个简单的web框架支持这种用法,感兴趣的话可以试一下,这里有一个简单的例子:https://github.com/shellfly/haro/blob/main/examples/closure/main.rs

1 共 2 条评论, 1 页