我注意到Rust没有处理HTTP的内置库,它只有一个处理原始IP和TCP协议的net模块.

我需要获取URL的&str,发出HTTP GET请求,如果成功,则返回String&str,对应于HTML或JSON或其他字符串形式的响应.

它看起来像:

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);

你可以在documentation页中找到更多的例子.

Edit:

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相关问答推荐

使用pyo3::Types::PyIterator的无限内存使用量

如何在Rust中表示仅具有特定大小的数组

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

如何将单个 struct 实例与插入器一起传递到Rust中的映射

try 创建随机数以常量

在Rust中声明和定义一个 struct 体有什么区别

如何迭代属性以判断相等性?

为什么特征默认没有调整大小?

使用 pyo3 将 Rust 转换为 Python 自定义类型

为什么 js_sys Promise::new 需要 FnMut?

Rust中的一生语法有什么作用?

如何刷新 TcpStream

SDL2 没有在终端键上触发?

无法把握借来的价值不够长寿,请解释

使用 serde_json 进一步处理字段

你能告诉我如何在 Rust 中使用定时器吗?

我如何将 google_gmail1::Gmail> 传递给线程生成?

使用 `.` 将 T 转换为 &mut T?

Abortable:悬而未决的期货?

如何在 Rust 中构建一个 str