用 Hyper 显示响应体只显示响应体的大小
Displaying the response body with Hyper only shows the size of the body
我尝试使用 Hyper
将 URL 的内容(正文)显示为文本
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);
}
但是运行这个脚本只是returns正文的大小:
Result: 22871
我做错了什么?我是不是误会了什么?
您正在将 get
的结果读入 s
,但您正在打印此函数的结果,即读取的字节数。 See the documentation for 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);
}
从 hyper 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)
})
}));
}
以下是如何使用 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(())
}
我尝试使用 Hyper
将 URL 的内容(正文)显示为文本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);
}
但是运行这个脚本只是returns正文的大小:
Result: 22871
我做错了什么?我是不是误会了什么?
您正在将 get
的结果读入 s
,但您正在打印此函数的结果,即读取的字节数。 See the documentation for 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);
}
从 hyper 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)
})
}));
}
以下是如何使用 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(())
}