如何在 Rust 中发出 GET 请求?

问题描述 投票:0回答:4

我注意到 Rust 没有内置的库来处理 HTTP,它只有一个

net
模块来处理原始 IP 和 TCP 协议。

我需要获取 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!
}
http get rust
4个回答
18
投票

针对此特定问题的当前最佳实践是使用

reqwest
板条箱,如 Rust 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(())
}

正如食谱中提到的,此代码将同步执行。

另请参阅:


16
投票

看看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"

6
投票

尝试去寻求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(())
}

2
投票

请注意,hyper有很多依赖项,而reqwest不仅依赖于

hyper
,而且还带来了相当多的额外依赖项。这对您来说可能是问题,也可能不是问题,但您应该注意这一点。

您可能要考虑的另一种选择是minreq。默认情况下,该板条箱只有 1 个依赖项(log 板条箱),还有一些依赖于可选功能的依赖项。例如,如果您激活

https-native
功能,它还会添加 native-tls 作为依赖项。

这是一个带有 minreq 的简单 GET 请求示例,我从他们的 docs 中复制了:

let response = minreq::get("http://example.com").send()?;
assert!(response.as_str()?.contains("</html>"));
assert_eq!(200, response.status_code);
© www.soinside.com 2019 - 2024. All rights reserved.