4 个版本
0.2.4 | 2020年5月1日 |
---|---|
0.2.3 | 2020年1月6日 |
0.1.0 | 2019年12月31日 |
#1849 in 网络编程
36KB
506 代码行
nano-get
使用标准库默认实现的 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);
}
有关详细信息,请查看Request
和Response
结构文档。
异步
截至编写本文时,这个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