更新一下:FormData确实很好用,不用刷新网页的情况下,可以直接完成我要的功能!
就是和warp搭配起来,有点麻烦。
loadDom.onclick = function () {
if (filesDom.value != "") {
var url = 'http://127.0.0.1:3030/';
var formData = new FormData();
loadedFile = filesDom.value;
formData.append("load", loadedFile);
var request = new XMLHttpRequest();
request.open("POST", url);
request.onload = function() {
if (request.readyState === request.DONE) {
if (request.status == 200) {
let response = request.responseText.split("\r\n");
let ew = JSON.parse( response[0] );
let yy = JSON.parse( response[1] );
for (var i = 0; i < ew.length; i++) {
ewValue[i].value = ew[i];
yyValue[i].value = yy[i];
}
}
}
};
request.send(formData);
}
}
rust做如下处理
#[tokio::main]
async fn main() {
let default_reply2 = warp::path::end().and(warp::get()).map(|| Response::builder().body(default_reply()));
let post_reply = warp::post()
.and(warp::multipart::form())
.and_then(post_reply);
let routers = warp::get().and(default_reply2).or(post_reply);
warp::serve(routers).run(([127, 0, 0, 1], 3030)).await;
}
async fn post_reply(form: warp::multipart::FormData) -> Result<impl warp::Reply, warp::Rejection> {
let mut parts: Vec<warp::multipart::Part> = form
.try_collect()
.await
.map_err(|_e| warp::reject::reject())?;
if parts[0].name() == "save" {
//....
} else {
//....
let response_string = read_setting();
Ok(Response::builder().body(response_string))
}
}
评论区
写评论非常感谢你的耐心回复!这个代码最诡异的是,明明size是没有任何意义的,但是不写就出错。最后我还是没能搞明白read_to_end的做法。
然后接受了你最早的建议,真香了warp。活见鬼的是,用warp就不出问题了。warp确实不错,就是教程太难找了,看着example连蒙带猜的把功能搞出来了。确实比标准库的原始做法写起来省时间得多,而且自带异步。但是缺点就是其实我用不到异步,但可能由于warp本身的原因加上异步的原因,exe文件从原先的268KB飙升至2120KB。
不过总算解决了!感谢感谢!
--
👇
c5soft: 要么调用read_exact, 要么调用read_to_end,后者很好用的
要么调用read_exact, 要么调用read_to_end,后者很好用的
数据大小是确定的,即使我使用
[0; 1024 * 10]
也没成功,所以大概率不是buffer不够大的问题呀。read_to_end我试了几次,有点tricky啊,一直调试不成功。--
👇
c5soft: 在不知道数据大小的情况下,可以用read_to_end
确实非常原始,但是问题是这个web应用(其实只能叫做一个小工具)需要的功能太过于简单。因为本质功能都是静态网页部分的JS代码完成的,rust在这里只负责实现点击保存按钮就“保存当前状态到本地文件”这一个单一功能而已。
而且local使用的话,只有一个使用者,不需要任何异步。所以我认为使用std里的内容是足够的。(其实最主要是我对web的库一无所知,而且以后大概率也用不到,特地去学感觉好麻烦)。
而且这个看起来不像是std库的问题啊。
--
👇
c5soft: 亲,用如此原始的方式写web应用不是在浪费您和大家的时间吗? 可以明确的是:POST上传数据,不管是哪种浏览器,上传数据大小都没有限制,实际极限取决于电脑资源。
建议您前端与后端都选择一种框架,前端推荐用svelte,后端推荐用warp。
在不知道数据大小的情况下,可以用read_to_end
亲,用如此原始的方式写web应用不是在浪费您和大家的时间吗? 可以明确的是:POST上传数据,不管是哪种浏览器,上传数据大小都没有限制,实际极限取决于电脑资源。
建议您前端与后端都选择一种框架,前端推荐用svelte,后端推荐用warp。