Отображение тела ответа с помощью Hyper показывает только размер тела

Я пытался отобразить содержимое (тело) URL-адреса в виде текста с помощью Hyper

extern crate hyper;

use hyper::client::Client;
use std::io::Read;

fn main () {

    let client = Client::new();
    let mut s = String::new();

    let res = client.get("https://www.reddit.com/r/programming/.rss")
                    .send()
                    .unwrap()
                    .read_to_string(&mut s)
                    .unwrap();

    println!("Result: {}", res);

}

Но выполнение этого скрипта просто возвращает размер тела:

Result: 22871

Что я сделал не так? Я что-то не так понял?

1 ответ

Решение

Вы читаете результат get в s но вы печатаете результат этой функции, который является числом прочитанных байтов. Смотрите документацию дляRead::read_to_string,

Таким образом, код, который печатает полученный контент:

extern crate hyper;

use hyper::client::Client;
use std::io::Read;

fn main () {

    let client = Client::new();
    let mut s = String::new();

    let res = client.get("https://www.reddit.com/r/programming/.rss")
                    .send()
                    .unwrap()
                    .read_to_string(&mut s)
                    .unwrap();

    println!("Result: {}", s);

}

Вот как распечатать статус и тело ответа, используя синтаксис tokio 0.2, hyper 0.13 и async/await.

use std::error::Error;

use hyper::body;
use hyper::{Body, Client, Response};
use hyper_tls::HttpsConnector;
use tokio;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
    let https = HttpsConnector::new();
    let client = Client::builder().build::<_, Body>(https);

    let res = client
        .get("https://www.reddit.com/r/programming/.rss".parse().unwrap())
        .await?;

    println!("Status: {}", res.status());

    let body_bytes = body::to_bytes(res.into_body()).await?;
    let body = String::from_utf8(body_bytes.to_vec()).expect("response was not valid utf-8");
    println!("Body: {}", body);

    Ok(())
}

Начиная с версии 0.12, при условии, что веб-страница является действующей UTF-8, работает следующее:

extern crate hyper;
extern crate hyper_tls;

use hyper::Client;
use hyper::rt::{self, Future, Stream};
use hyper_tls::HttpsConnector;

fn main() {
    rt::run(rt::lazy(|| {
        let https = HttpsConnector::new(4).unwrap();
        let client = Client::builder().build::<_, hyper::Body>(https);

        client.get("https://www.reddit.com/r/programming/.rss".parse().unwrap())
            .and_then(|res| {
                println!("status {}", res.status());
                res.into_body().concat2()
            }).map(|body| {
                println!("Body {}", String::from_utf8(body.to_vec()).unwrap());
            })
            .map_err(|err| {
                println!("error {}", err)
            })
    }));
}
Другие вопросы по тегам