Displaying the response body with Hyper only shows the size of the body
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);
}
Here is how to print the response status and body using tokio 0.2, hyper 0.13, and async/await syntax.
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(())
}
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)
})
}));
}