#http-request #http #async-http #client #request #http-api

http-adapter

适用于不特定HTTP客户端请求的适配器

3个不稳定版本

0.2.0 2023年11月17日
0.1.1 2023年5月18日
0.1.0 2023年5月18日

#329HTTP客户端

每月40次下载
用于 4 个 crate

LGPL-3.0

9KB

http-adapter

文档

查看 完整文档

用法

将此添加到您的Cargo.toml中

[dependencies]
http-adapter = "0.2.0"

Maintenance Build Status Documentation

适用于不特定HTTP客户端请求的适配器

此crate允许异步库不依赖于特定的HTTP客户端,不因为HTTP客户端而强制选择特定的异步运行时。这在您开发提供对HTTP API访问的crate时非常有用。

如果您需要执行一些简单的HTTP请求(包括多种HTTP方法、头部/cookie管理),希望不特定于HTTP客户端并且不锁定下游用户到特定的异步运行时(例如tokioasync-stdsmol),那么您需要确保您的API客户端接受实现HttpClientAdapter的泛型类型的一个实例,并使用它来执行HTTP请求。您的crate的用户将根据实际的HTTP客户端(例如requestureqsurf等)使用特定的适配器,并在创建您的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