«iron :: Modifier <Response>не реализован» при попытке установить тип содержимого для ответа с использованием iron и mime - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь запустить примеры из книги Programming Rust , опубликованной O'Reilly, и я застрял в том, чтобы следующий код успешно компилировался:

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`

My 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 , но я не мог понять, как обойти эту ошибку.

1 Ответ

0 голосов
/ 07 февраля 2019

Как вы заметили, новейшие версии mime и iron не совместимы с примером кода из книги. Проблема была поднята в официальном хранилище книги .

Вы можете использовать старый mime ящик, но в долгосрочной перспективе лучше всего использовать mime из железа ящик , как объяснено в документах .

Для железа 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)])
    )
);
...