火箭没有设置内容类型的文本/ html

Hen*_*Jan 7 content-type rust

我正在使用Rust Rocket框架生成一个简单的网页.

当去索引页面"/"时:

#[get("/")]
fn page_index() -> &'static str {
    r#"
        <title>GCD Calculator</title>
        <form action="/gcd" method="post">
            <input type="text" name="n" />
            <input type="text" name="n" />
            <button type="submit">Compute GCD</button>
        </form>
    "#
}
Run Code Online (Sandbox Code Playgroud)

服务器控制台告诉我

GET / text/html:
=> Matched: GET /
=> Outcome: Success
=> Response succeeded.
Run Code Online (Sandbox Code Playgroud)

但是我的浏览器告诉我Content-Type是text/plain.

如何使Rocket正确响应text/html.我做错了什么还是Rocket?

Dan*_*lme 9

关于引导反应说明了如何设置响应的内容类型.特别是,您需要rocket::response::content::Html:

use rocket::response::content::Html;
#[get("/")]
fn page_index() -> Html<&'static str> {
    Html(r"<html>...</html>")
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要将Content-Type设置为"text/html",则实际上必须返回HTML文档.您在示例代码中发布的内容只是HTML的一个片段.实际上,将HTML放入静态foo.html文件并使用NamedFile它直接提供(自动设置Content-Type)或使用模板要容易得多.

  • 哦,"text/html"来自请求中的Accept标头,表明浏览器期望的类型.如果您使用[内容协商](https://rocket.rs/guide/requests/#format),它只会影响实际发送的内容. (3认同)

squ*_*guy 5

默认情况下,Rocket 将使用 text/plain 进行响应,因此您必须使用它提供的内容模块覆盖它。

您可以这样使用Html响应器:

use rocket::response::content;

#[get("/")]
fn page_index() -> content::Html<&'static str> {
    content::Html(r#"
        <title>GCD Calculator</title>
        <form action="/gcd" method="post">
            <input type="text" name="n" />
            <input type="text" name="n" />
            <button type="submit">Compute GCD</button>
        </form>
    "#)
}
Run Code Online (Sandbox Code Playgroud)