rust - "iron::Modifier<Response> is not implemented"尝试使用 iron 和 mime 设置响应的内容类型

标签 rust mime iron

我正在尝试运行 O'Reilly 出版的 Programming Rust 一书中的示例,但我坚持要使以下代码成功编译:

Cargo.toml

[package]
name = "gcd-online"
version = "0.1.0"
authors = ["Jignesh Gohel <abc@example.com>"]
edition = "2018"

[dependencies]
iron = "0.6.0"
mime = "0.3.12"
router = "0.6.0"
urlencoded = "0.6.0"

/src/main.rs

extern crate iron;
extern crate mime;

use iron::prelude::*;
use iron::status;

fn main() {
    println!("Serving on http://localhost:3000...");
    Iron::new(get_form).http("localhost:3000").unwrap();
}


fn get_form(_request: &mut Request) -> IronResult<Response> {
    let mut response = Response::new();

    response.set_mut(status::Ok);
    response.set_mut(mime::TEXT_HTML_UTF_8);
    response.set_mut(r#"
        <title>GCD Calculator</title>
        <form action="/gcd" method="post">
            <input type="text" name="n" />
            <input type="text" name="m" />
            <button type="submit">Compute GCD</button>
        </form>
    "#);

    Ok(response)
}

输出

   Compiling gcd-online v0.1.0 (~/oreilly-programming-rust-book-examples/chapter-1/gcd-online)                                                          
error[E0277]: the trait bound `mime::Mime: iron::modifier::Modifier<iron::Response>` is not satisfied                                                                           
  --> src/main.rs:17:14                                                                                                                                                         
   |                                                                                                                                                                            
17 |     response.set_mut(mime::TEXT_HTML_UTF_8);                                                                                                                               
   |              ^^^^^^^ the trait `iron::modifier::Modifier<iron::Response>` is not implemented for `mime::Mime`

我的 Cargo.toml 使用最新版本的依赖项,但是本书作者使用以下版本

[dependencies]
iron = "0.5.1"
mime = "0.2.3"
router = "0.5.1"
urlencoded = "0.5.0"

作为作者使用以下代码的一部分

#[macro_use] extern crate mime;

fn get_form(_request: &mut Request) -> IronResult<Response> {
    let mut response = Response::new();

    response.set_mut(mime!(Text/Html; Charset=Utf8));

    Ok(response)
}

我认为版本的差异是导致编译错误的原因。

我试图浏览 iron 的文档和 mime crate ,但我不知道如何解决这个错误。

最佳答案

正如您所注意到的,最新版本的mimeiron 与书中的示例代码不兼容。 issue was raised on the official book's repository

您可以使用旧的 mime crate,但从长远来看,最好使用 iron crate as explained in the docs 中的 mime

对于 iron 0.6.0,您可以更换故障线:

response.set_mut(mime::TEXT_HTML_UTF_8);

response.set_mut(mime!(Text/Html; Charset=Utf8));

具有以下之一:

response.headers.set(iron::headers::ContentType("text/html; charset=utf-8".parse::<iron::mime::Mime>().unwrap()));

response.headers.set(iron::headers::ContentType(
    iron::mime::Mime(
        iron::mime::TopLevel::Text,
        iron::mime::SubLevel::Html,
            vec![(iron::mime::Attr::Charset, iron::mime::Value::Utf8)])
    )
);

关于rust - "iron::Modifier<Response> is not implemented"尝试使用 iron 和 mime 设置响应的内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54007531/

相关文章:

html - 在 html 电子邮件中嵌入图像

function - 无法在有关 iron lib 的 fn 项目中捕获动态环境

rust - 如何在 Iron 中使用服务器发送的事件?

rust - 编译 hyper 0.9.17 时出现 "macro undefined"错误

rust - 如何在 Rust 中获取向量中的最小值?

Rust - 特征 `StdError` 没有为 `OsString` 实现

PHP Mailparse 阻塞非 ascii 字符

python - 如何使用 Python imaplib 回复电子邮件并包含原始消息?

rust - 如何在 Rust 中过滤索引上的向量

multithreading - 如何将对堆栈变量的引用传递给线程?