我创建了以下登录表单和随附的模板:
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");
}
assets/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>
当我第一次提交表单时,我看到了“hello”消息。 如果我再次提交表单,我会看到“未找到”。
我不知道问题出在哪里。
最佳答案
问题是您正在发送 POST 数据但未被读取,这会渗入下一个请求(由于 keepalive)。
要解决此问题,您可以确保读取 POST 的正文,或者将 Connection: Close
添加到响应 header 以防止保持事件状态。
FWIW:这是一个 known issue in hyper ,但镍应该添加它自己的解决方案以防止混淆。如果您想关注这方面的更新,请订阅 issue Shepmaster logged在 Github 上。
关于rust - 第一次使用 nickel.rs 发布表单数据,随后返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408373/