Rust 使用nikel.rs发布表单数据第一次有效,随后返回404次

Rust 使用nikel.rs发布表单数据第一次有效,随后返回404次,rust,nickel,Rust,Nickel,我已经创建了以下登录表单和附带的模板: main.rs #[macro_use] extern crate nickel; extern crate mustache; extern crate rustc_serialize; use std::collections::HashMap; use nickel::{Nickel, MediaType, HttpRouter}; use nickel::status::StatusCode; fn main() { let mut s

我已经创建了以下登录表单和附带的模板:

main.rs

#[macro_use]
extern crate nickel;
extern crate mustache;
extern crate rustc_serialize;

use std::collections::HashMap;
use nickel::{Nickel, MediaType, HttpRouter};
use nickel::status::StatusCode;

fn main() {
    let mut server = Nickel::new();
    let mut router = Nickel::router();

    router.get("/", middleware!(|request, mut response| {
        response.set(StatusCode::Ok);
        response.set(MediaType::Html);
        return response.send_file("assets/login.tpl");
    }));

    router.post("/login", middleware!(|request, mut response| {
        response.set(StatusCode::Ok);
        response.set(MediaType::Html);

        let mut data: HashMap<&str, &str> = HashMap::new();
        data.insert("error", "hello");
        return response.render("assets/login.tpl", &data);
    }));

    server.utilize(router);
    server.listen("127.0.0.1:6767");
}
#[宏使用]
外部板条箱镍;
外部板条箱胡子;
外部板条箱锈迹丛生;
使用std::collections::HashMap;
使用镍:{nickel,MediaType,HttpRouter};
使用镍::状态::状态代码;
fn main(){
让mut server=nikel::new();
让mut router=nicle::router();
路由器.get(“/”,中间件!(|请求,mut响应|{
response.set(状态码::Ok);
set(MediaType::Html);
返回响应。发送_文件(“assets/login.tpl”);
}));
路由器.post(“/login”,中间件!(|请求,mut响应){
response.set(状态码::Ok);
set(MediaType::Html);
让mut data:HashMap=HashMap::new();
插入(“错误”、“你好”);
返回response.render(“assets/login.tpl”、&data);
}));
利用服务器(路由器);
监听(“127.0.0.1:6767”);
}
资产/login.tpl

<html lang="en">
    <head>
        <meta charset="utf8"/>
    </head>
    <body>
        <h1>Login</h1>
        <form method="post" action="login">
            <label for="email">Email</label>
            <input type="email" name="email"/>
            <br/>
            <label for="password">Password</label>
            <input type="password" name="password"/>
            <br/>
            <button type="submit">Login</button><br/>
            <a href="/register">Register</a>
        </form>
        {{error}}
    </body>
</html>

登录
电子邮件

密码
登录
{{error}}
当我第一次提交表单时,我会看到“hello”消息。 如果我再次提交表格,我会看到“未找到”


我不知道问题出在哪里。

问题是,您正在发送POST数据,但无法读取,这会导致下一个请求(由于keepalive)

要修复此问题,您可以确保文章的正文被读取,或者向响应标题添加
连接:Close
,以防止保留


FWIW:这是一个很好的解决方案,但镍应该添加它自己的解决方案,以防止混淆。如果您想关注此更新,请订阅Github上的。

问题可能出在action=“login”这是相对的,可能您必须通过绝对路径。@Fylux我也这么想,但将其更改为
/login
似乎没有帮助。我正在尝试按照您的建议添加
response.set(Connection::close())
但是当Cargo尝试编译hyper时,它会崩溃,因为它找不到openssl.h。您在哪个平台上?如果您不需要ssl支持,您可能需要将Cargo.toml文件中的hyper依赖项更改为类似于
[dependentials.hyper]default features=false version=“0.6”#或0.8,如果你在上面的话
关闭连接解决了我的问题。有没有更干净的方法来写这个:
response.headers_mut().set_raw(“connection”,vec![b“close.”to_vec());
你可以使用,例如
response.set(connection::close())
其中
连接
是从
hyper::header导入的
我试过了,它抱怨
连接
没有实现trait
修饰符
,即使我已经导入。