Displaying the response body with Hyper only shows

2019-06-20 06:45发布

I tried to display the content (body) of an URL as text using 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);

}

But running this script just returns the size of the body:

Result: 22871

What did I do wrong? Did I misunderstood something?

标签: rust hyper
2条回答
虎瘦雄心在
2楼-- · 2019-06-20 07:00

You are reading the result of the get into s but you are printing the result of this function, which is the number of bytes read. See the documentation for Read::read_to_string.

Thus the code which prints the retrieved content is:

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);

}
查看更多
Luminary・发光体
3楼-- · 2019-06-20 07:06

As of hyper 0.12, the following works, provided the webpage is valid 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)
            })
    }));
}
查看更多
登录 后发表回答