< 返回版块

eweca-d 发表于 2021-05-14 20:27

更新一下: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))  
     }
}

评论区

写评论
作者 eweca-d 2021-05-14 23:55

非常感谢你的耐心回复!这个代码最诡异的是,明明size是没有任何意义的,但是不写就出错。最后我还是没能搞明白read_to_end的做法。

然后接受了你最早的建议,真香了warp。活见鬼的是,用warp就不出问题了。warp确实不错,就是教程太难找了,看着example连蒙带猜的把功能搞出来了。确实比标准库的原始做法写起来省时间得多,而且自带异步。但是缺点就是其实我用不到异步,但可能由于warp本身的原因加上异步的原因,exe文件从原先的268KB飙升至2120KB。

不过总算解决了!感谢感谢!

--
👇
c5soft: 要么调用read_exact, 要么调用read_to_end,后者很好用的

let mut buffer = Vec::<u8>:new();
let size=stream.read_to_end(&mut buffer).unwrap();

c5soft 2021-05-14 22:09

要么调用read_exact, 要么调用read_to_end,后者很好用的

let mut buffer = Vec::<u8>:new();
let size=stream.read_to_end(&mut buffer).unwrap();

作者 eweca-d 2021-05-14 21:47

数据大小是确定的,即使我使用[0; 1024 * 10]也没成功,所以大概率不是buffer不够大的问题呀。read_to_end我试了几次,有点tricky啊,一直调试不成功。

--
👇
c5soft: 在不知道数据大小的情况下,可以用read_to_end

let mut buffer = Vec::&lt;u8&gt;::new();
let size=stream.read_to_end(&amp;mut buffer).unwrap(); 
作者 eweca-d 2021-05-14 21:21

确实非常原始,但是问题是这个web应用(其实只能叫做一个小工具)需要的功能太过于简单。因为本质功能都是静态网页部分的JS代码完成的,rust在这里只负责实现点击保存按钮就“保存当前状态到本地文件”这一个单一功能而已。

而且local使用的话,只有一个使用者,不需要任何异步。所以我认为使用std里的内容是足够的。(其实最主要是我对web的库一无所知,而且以后大概率也用不到,特地去学感觉好麻烦)。

而且这个看起来不像是std库的问题啊。

--
👇
c5soft: 亲,用如此原始的方式写web应用不是在浪费您和大家的时间吗? 可以明确的是:POST上传数据,不管是哪种浏览器,上传数据大小都没有限制,实际极限取决于电脑资源。

建议您前端与后端都选择一种框架,前端推荐用svelte,后端推荐用warp。

c5soft 2021-05-14 21:14

在不知道数据大小的情况下,可以用read_to_end

let mut buffer = Vec::&lt;u8&gt;::new();
let size=stream.read_to_end(&amp;mut buffer).unwrap(); 
c5soft 2021-05-14 21:05

亲,用如此原始的方式写web应用不是在浪费您和大家的时间吗? 可以明确的是:POST上传数据,不管是哪种浏览器,上传数据大小都没有限制,实际极限取决于电脑资源。

建议您前端与后端都选择一种框架,前端推荐用svelte,后端推荐用warp。

1 2 共 26 条评论, 2 页