#http #https #http-request #http-response #http-basic #https-client

nano-get

一个非常小的 HTTP(s) GET 实现版本,使用最小依赖

4 个版本

0.2.4 2020年5月1日
0.2.3 2020年1月6日
0.1.0 2019年12月31日

#1849 in 网络编程

MIT 许可证

36KB
506 代码行

nano-get

Crates.io Docs.rs Rust

使用标准库默认实现的 HTTP GET 最小化实现。

如果您需要 https,请启用 "https" 功能标志,如下所示:

nano-get = { version = "0.2.4", features = ["https"] }

启用 https 标志将使用 Rust 的 openssl crate。

OpenSSL Crate 假设您环境中已安装 OpenSSL。

请注意,这可能不是最佳或最有效率的 HTTP GET 实现。其目的是提供一个基本的 HTTP GET 实现并避免在只需简单的 GET 方法时导入大量包。

可能以后还会添加更多功能,主要目标是减小最终二进制文件的大小,避免引入太多依赖。

目前,如果您启用了 https 功能标志,唯一的依赖项是 openssl crate。

功能标志

  • https : 此标志启用基于 Rust openssl crate 的 https

示例用法

如果您只关心发起 GET 请求,可以像下面这样调用 nano_get::get() 方法。

extern crate nano_get;
use nano_get::get;

fn main() {
    let response = get("http://dummy.restapiexample.com/api/v1/employees");
    println!("{}", response);
}

启用 https 功能标志的示例

extern crate nano_get;
use nano_get::get;

fn main() {
    let response = get("https://google.com");
    println!("{}", response);
}

为了对请求/响应有更精细的控制,您可以构建一个请求。

extern crate nano_get;
use nano_get::get;

fn main() {
    let mut request = Request::default_get_request("http://dummy.restapiexample.com/api/v1/employees").unwrap();
    request.add_header("test", "abracadabra");
    let response = request.execute().unwrap();
    println!("{}", response.status);
    println!("{}", response.body);
}

模型

该 crate 中的基本模型有

  • Url
  • Request
  • Response

执行 HTTP(s) 请求

有两种方式可以执行 HTTP(s) 请求。

基本 GET

基本版本,如使用 nano_get::get() 函数所示,它接受一个 URL 并返回响应体。

示例

extern crate nano_get;
use nano_get::get;

fn main() {
    let response = nano_get::get("https://www.google.com");
    println!("{}", response);
}

请求-响应模型

存在一种更精细的方法,通过使用nano_get::Request对象。这使您可以访问请求头、可选的请求体,并且执行返回一个nano_get::Response对象。这允许检查HTTP响应代码、响应体等。

示例

extern crate nano_get;
use nano_get::{Request, Response};

fn main() {
    let mut request = Request::default_get_request("http://example.com/").unwrap();
    let response: Response = request.execute().unwrap();
    println!("{}", response.body);
}

有关详细信息,请查看RequestResponse结构文档。

异步

截至编写本文时,这个crate不使用Rust的async/await功能。然而,这并不会阻止用户在异步环境中使用这个库。

下面是一个示例。这个示例使用位于jsonplaceholder的免费REST API并发检索100张专辑(100 HTTPS GET请求)使用tokio/futures异步/等待工具。

这个例子不是基准测试,只是用来演示如何编写crate的get方法的异步包装。这也不是展示异步库典型用法的目的。

Cargo.toml片段

[dependencies]
nano-get = {version = "0.2.4", features = ["https"] }
tokio = { version = "0.2.10", features = ["blocking", "rt-threaded"] }
futures = "0.3.1"

main.rs

extern crate futures;
extern crate nano_get;
extern crate tokio;

use std::time::Instant;

use tokio::runtime::{Runtime, Builder};
use futures::future::try_join_all;

fn main() {
    let mut runtime: Runtime = Builder::new().threaded_scheduler().build().unwrap();
    runtime.block_on(async {
        let base_url = "https://jsonplaceholder.typicode.com/albums";
        let mut handles = Vec::with_capacity(100);
        let start = Instant::now();
        for i in 1..=100 {
            let url = format!("{}/{}", base_url, i);
            handles.push(tokio::task::spawn_blocking(move || nano_get::get(url)));
        }
        let responses: Vec<String> = try_join_all(handles).await.unwrap();
        let duration = start.elapsed();
        println!("# : {}\n{}", responses.len(), responses.last().unwrap());
        println!("Time elapsed in http get is: {:?}", duration);
        println!("Average time for get is: {}s", duration.as_secs_f64() / (responses.len() as f64));
    });
}

示例输出

# : 100
{
  "userId": 10,
  "id": 100,
  "title": "enim repellat iste"
}
Time elapsed in http get is: 1.171043748s
Average time for get is: 0.01171043748s

依赖关系

~0–485KB
~11K SLoC