如何在Rust中发出GET请求?

ulmd4ohb  于 2023-01-02  发布在  其他
关注(0)|答案(4)|浏览(372)

我注意到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!
}
0mkxixxg

0mkxixxg1#

当前解决这个问题的最佳实践是使用reqwest crate,如指定的in the 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(())
}

正如食谱中提到的,这段代码将同步执行。
另见:

but5z9lq

but5z9lq2#

看一下Hyper
发送GET请求就是这么简单。

let client = Client::new();

let res = client.get("http://example.domain").send().unwrap();
assert_eq!(res.status, hyper::Ok);

您可以在documentation中找到更多示例。

    • 编辑**:自从他们开始使用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"
vsnjm48y

vsnjm48y3#

尝试请求:

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(())
}
ef1yzkbh

ef1yzkbh4#

请注意hyper有很多依赖项,reqwest不仅依赖于hyper,而且还带来了很多额外的依赖项,这对您来说可能是个问题,也可能不是,但这是您应该意识到的。
另一个你可以考虑的选择是minreq。默认情况下,这个机箱只有一个依赖项(log机箱),还有一些依赖于可选特性的依赖项。例如,如果你激活https-native特性,它也会添加native-tls作为依赖项。

相关问题