当前位置:  开发笔记 > 编程语言 > 正文

如何从Rust发出HTTP请求?

如何解决《如何从Rust发出HTTP请求?》经验,为你挑选了3个好方法。

如何从Rust发出HTTP请求?我似乎无法在核心库中找到任何东西.

我不需要解析输出,只需发出请求并检查HTTP响应代码.

奖励标记,如果有人可以告诉我如何URL编码我的URL上的查询参数!



1> Isaac Aggrey..:

在Rust中执行HTTP的最简单方法是reqwest.它是使Hyper更易于使用的包装器.

Hyper是Rust的一个流行的HTTP库,它使用两个库:Tokio的事件循环用于发出非阻塞请求,期货-rs用于期货/承诺.下面是一个基于Hyper的示例,其中很大程度上受到其文档中的示例的启发.

// Rust 1.36, Hyper 0.12.35, tokio-core 0.1.17, futures 0.1.29

extern crate futures;
extern crate hyper;
extern crate tokio_core;

use futures::{Future};
use hyper::{Client, Uri};
use tokio_core::reactor::Core;

fn main() {
    // Core is the Tokio event loop used for making a non-blocking request
    let mut core = Core::new().unwrap();

    let client = Client::new();

    let url : Uri = "http://httpbin.org/response-headers?foo=bar".parse().unwrap();
    assert_eq!(url.query(), Some("foo=bar"));

    let request_result = core.run(client
        .get(url)
        .map(|res| {
            println!("Response: {}", res.status());
        })
        .map_err(|err| {
            println!("Error: {}", err);
       })
    );

}

Cargo.toml:

[dependencies]
hyper = "0.12.35"
tokio-core = "0.1.17"
futures = "0.1.29"

对于后代,我在下面留下了我的原始答案,但请参见上面的Rust 1.19更新(截至本文撰写时的最新稳定版).

我相信你要找的是标准库.现在在rust-http和Chris Morgan的答案是在可预见的未来当前Rust的标准方式.我不确定我能带你走多远(希望我没有带你错误的方向!),但是你会想要这样的东西:

// Rust 0.6 -- old code
/*
extern mod std;

use std::net_ip;
use std::uv;

fn main() {
    let iotask = uv::global_loop::get();
    let result = net_ip::get_addr("www.duckduckgo.com", &iotask);

    io::println(fmt!("%?", result));
 }
 */

至于编码,在src/libstd/net_url.rs中的单元测试中有一些例子.



2> Chris Morgan..:

更新:这个答案指的是相当古老的历史.对于目前的最佳实践,请查看Isaac Aggrey的答案.


我一直在研究rust-http,它已成为Rust的事实上的 HTTP库(Servo使用它); 它目前还远未完整且记录很少.这是一个使用状态代码发出请求并执行操作的示例:

extern mod http;
use http::client::RequestWriter;
use http::method::Get;
use http::status;
use std::os;

fn main() {
    let request = RequestWriter::new(Get, FromStr::from_str(os::args()[1]).unwrap());
    let response = match request.read_response() {
        Ok(response) => response,
        Err(_request) => unreachable!(), // Uncaught condition will have failed first
    };
    if response.status == status::Ok {
        println!("Oh goodie, I got me a 200 OK response!");
    } else {
        println!("That URL ain't returning 200 OK, it returned {} instead", response.status);
    }
}

使用URL作为唯一的命令行参数运行此代码,它将检查状态代码!(仅限HTTP;无HTTPS.)

比较src/examples/client/client.rs一个更多的例子.

rust-http跟踪生锈的主要分支.目前它将在刚刚发布的Rust 0.8中运行,但很快就会出现重大变化. 实际上,Rust-http没有版本可以在Rust 0.8上运行 - 有一个突破性的变化,在发布之前的隐私规则中无法解决,留下了一些生锈的http依赖于extra :: url不可访问.这已经修复了,但是它留下了锈-http与Rust 0.8不兼容.


至于查询字符串编码问题,目前应该用extra::url::Query(typedef for ~[(~str, ~str)])来完成.适当的转换功能:

extra::url::query_to_str

extra::url::query_from_str(对不起,目前不能使用它,因为它是私有的.公关即将公开.同时,这个链接实际上不应该工作,它只能用于https://github.com/ mozilla/rust/issues/7476.)


请注意,rust-http现在标记为已过时.它的作者建议使用Hyper而不是https://github.com/hyperium/hyper

3> dvdplm..:

使用curl绑定.坚持下去Cargo.toml:

[dependencies.curl]
git = "https://github.com/carllerche/curl-rust"

......这个在src/main.rs:

extern crate curl;

use curl::http;

fn main(){
  let resp = http::handle()
    .post("http://localhost:3000/login", "username=dude&password=sikrit")
    .exec().unwrap();

  println!("code={}; headers={}; body={}",
    resp.get_code(), resp.get_headers(), resp.get_body());    

}


这将比其他答案好得多,因为它避免了处理“期货”(Futures),这是我见过的最复杂,未记录的内容之一。不幸的是,由于没有`curl :: http`(不再可用),它不起作用-只有一种叫做“ easy”的东西,它本身就很复杂,几乎没有记录。
@JeffAllen可能更合适,但几乎找不到。因此,我选择了一个次优选项,该选项适用于不适用的“适当”选项。
推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有