[英]How do you make a GET request in Rust?
我注意到 Rust 没有内置库来处理 HTTP,它只有一个处理原始 IP 和 TCP 协议的net
模块。
我需要获取 URL 的&str
,发出 HTTP GET 请求,如果成功,则返回对应于 HTML 或 JSON 或字符串形式的其他响应的String
或&str
。
它看起来像:
use somelib::http;
let response = http::get(&"http://stackoverflow.com");
match response {
Some(suc) => suc,
None => panic!
}
看看Hyper 。
发送GET请求就像这样简单。
let client = Client::new();
let res = client.get("http://example.domain").send().unwrap();
assert_eq!(res.status, hyper::Ok);
您可以在文档中找到更多示例。
编辑 :由于他们开始使用Tokio ,似乎Hyper变得有点复杂。 这是更新版本。
extern crate futures;
extern crate hyper;
extern crate tokio_core;
use std::io::{self, Write};
use futures::{Future, Stream};
use hyper::Client;
use tokio_core::reactor::Core;
fn main() {
let mut core = Core::new().unwrap();
let client = Client::new(&core.handle());
let uri = "http://httpbin.org/ip".parse().unwrap();
let work =
client.get(uri).and_then(|res| {
println!("Response: {}", res.status());
res.body().for_each(|chunk| {
io::stdout()
.write_all(&chunk)
.map_err(From::from)
})
});
core.run(work).unwrap();
}
这是必需的依赖项。
[dependencies]
futures = "0.1"
hyper = "0.11"
tokio-core = "0.1"
针对此特定问题的当前最佳实践是使用Rust Cookbook中指定的reqwest
crate。 此代码稍微改编自cookbook以独立运行:
extern crate reqwest; // 0.9.18
use std::io::Read;
fn run() -> Result<(), Box<dyn std::error::Error>> {
let mut res = reqwest::get("http://httpbin.org/get")?;
let mut body = String::new();
res.read_to_string(&mut body)?;
println!("Status: {}", res.status());
println!("Headers:\n{:#?}", res.headers());
println!("Body:\n{}", body);
Ok(())
}
正如食谱中提到的,这段代码将同步执行。
也可以看看:
尝试去reqwest:
extern crate reqwest;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut res = reqwest::get("https://httpbin.org/headers")?;
// copy the response body directly to stdout
std::io::copy(&mut res, &mut std::io::stdout())?;
Ok(())
}
请注意, hyper有很多依赖项, request不仅依赖于hyper
,还带来了很多额外的依赖项。 这对您来说可能是问题,也可能不是问题,但这是您应该注意的事情。
您可能要考虑的替代方案是minreq 。 该箱子默认只有 1 个依赖项(日志箱子),还有一些依赖于可选功能。 例如,如果您激活https-native
功能,它还会添加native-tls作为依赖项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.