3个不稳定版本
0.2.0 | 2023年11月17日 |
---|---|
0.1.1 | 2023年5月18日 |
0.1.0 | 2023年5月18日 |
#329 在 HTTP客户端
每月40次下载
用于 4 个 crate
9KB
http-adapter
文档
查看 完整文档
用法
将此添加到您的Cargo.toml中
[dependencies]
http-adapter = "0.2.0"
适用于不特定HTTP客户端请求的适配器
此crate允许异步库不依赖于特定的HTTP客户端,不因为HTTP客户端而强制选择特定的异步运行时。这在您开发提供对HTTP API访问的crate时非常有用。
如果您需要执行一些简单的HTTP请求(包括多种HTTP方法、头部/cookie管理),希望不特定于HTTP客户端并且不锁定下游用户到特定的异步运行时(例如tokio
、async-std
、smol
),那么您需要确保您的API客户端接受实现HttpClientAdapter
的泛型类型的一个实例,并使用它来执行HTTP请求。您的crate的用户将根据实际的HTTP客户端(例如request
、ureq
、surf
等)使用特定的适配器,并在创建您的API客户端时提供它。
用法
HttpClientAdapter
trait公开了一个异步函数[HttpClientAdapter::execute()
]。它接受一个http::Request
实例,该实例编码了必要的请求参数,如HTTP方法和URL,并执行它。然后它返回一个包含服务器响应的http::Response
实例。请求和响应类型来自http
crate。请求和响应的体期望是Vec<u8>
。
适配器实现
要为HTTP客户端库创建HttpClientAdapter的新实现,请参考以下crates:
http-adapter-reqwest
- 异步包装器,简单案例,因为reqwest
内部使用http
类型http-adapter-surf
- 异步包装器,更复杂的案例,因为需要转换类型http-adapter-ureq
- 同步包装器,复杂案例,因为需要以运行时无关的方式包装同步客户端
简单的APIClient示例
use http_adapter::http::Request;
use http_adapter::HttpClientAdapter;
struct APIClient<HttpClient> {
http_client: HttpClient,
}
impl<HttpClient: HttpClientAdapter> APIClient<HttpClient> {
/// Create new `APIClient` by supplying an HTTP client implementation
pub fn new(http_client: HttpClient) -> Self {
Self { http_client }
}
pub async fn create_entry(&self) -> Result<(), HttpClient::Error> {
let request = Request::post("http://localhost")
.header(http::header::AUTHORIZATION, "Bearer 12345")
.body(r#"{ "value": 42 }"#.as_bytes().to_vec())
.expect("Can't create request");
let response = self.http_client.execute(request).await?;
Ok(())
}
}
/// Default implementation for cases where adapter implements `Default`
impl<HttpClient: HttpClientAdapter + Default> Default for APIClient<HttpClient> {
fn default() -> Self {
Self::new(HttpClient::default())
}
}
许可:LGPL-3.0
依赖项
~0.9–1.4MB
~28K SLoC