rust - 第一次使用 nickel.rs 发布表单数据,随后返回 404

标签 rust nickel

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

ma​​in.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/

相关文章:

rust - 在闭包内独立借用结构的字段

mongodb - 错误 : type parameter `D` must be used as the type parameter for some local type

rest - 无法在 `Fn` 闭包中将捕获的外部变量借用为可变的

oauth - 如何获取 Authorization Bearer header ?

rust - Rust 中引用与值的显式注释

借用 self 时在 HashMap 上进行 Rust 循环

enums - 为什么这个 Rust 枚举没有变小?

ssl - 使用 Let's Encrypt 证书的 Nickel 服务器在使用 ruSTL 访问时出现握手错误

rust - 不能借用 `*request` 作为可变的,因为它也被借用为不可变的

rust - 使用变量两次而不会使用rust