5 个不稳定版本
0.4.0-alpha.1 | 2024 年 6 月 8 日 |
---|---|
0.3.2 | 2024 年 5 月 5 日 |
0.3.0 | 2024 年 4 月 30 日 |
0.2.1 | 2024 年 4 月 21 日 |
#152 in HTTP 客户端
27KB
361 代码行
tower-http-client
此库为 HTTP 客户端提供中间件和多种实用工具。
因此,它扩展了使用 tower_http
中间件创建 HTTP 客户端的 tower
功能。
目前,事实上的标准客户端库是 reqwest
,它与 tower
服务兼容性较差,但多亏了 tower_reqwest
crate,它可以与任何 tower_http
层一起使用。
项目的首要目标是创建一个比 reqwest_middleware
更灵活、更可扩展的替代品。
示例
使用来自 tower_http
的层进行简单客户端使用的示例。
use http::{header::USER_AGENT, HeaderValue};
use tower::{ServiceBuilder, ServiceExt};
use tower_http::ServiceBuilderExt;
use tower_http_client::{ServiceExt as _, ResponseExt as _};
use tower_reqwest::HttpClientLayer;
/// Implementation agnostic HTTP client.
type HttpClient = tower::util::BoxCloneService<
http::Request<reqwest::Body>,
http::Response<reqwest::Body>,
anyhow::Error,
>;
/// Creates HTTP client with Tower layers on top of the given client.
fn make_client(client: reqwest::Client) -> HttpClient {
ServiceBuilder::new()
// Add some layers.
.override_request_header(USER_AGENT, HeaderValue::from_static("tower-http-client"))
// Make client compatible with the `tower-http` layers.
.layer(HttpClientLayer)
.service(client)
.map_err(anyhow::Error::from)
.boxed_clone()
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create a new client
let client = make_client(reqwest::Client::new());
// Execute request by using this service.
let response = client
.clone()
.get("http://ip.jsontest.com")
.send()?
.await?;
let text = response.body_reader().utf8().await?;
println!("{text}");
Ok(())
}
依赖项
~3–14MB
~171K SLoC