背景:
通过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
}
1
共 2 条评论, 1 页
评论区
写评论App里面支持放Data
这个代码样例在文档上面有 doc[https://docs.rs/actix-web/latest/actix_web/struct.App.html#method.app_data]
看起来需要一个closure来生成一个handler,这样就可以在handler中使用app这个变量,最近刚写了一个简单的web框架支持这种用法,感兴趣的话可以试一下,这里有一个简单的例子:https://github.com/shellfly/haro/blob/main/examples/closure/main.rs