You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Reqwest,无需显式引入Hyper如何调用header!宏?

关于Reqwest中使用Hyper的header!宏的解决方案

这个问题我之前也碰到过,刚好可以给你梳理下可行的解决思路:

核心结论

Reqwest确实依赖Hyper,但默认不会将Hyper的header!宏暴露到自己的作用域中,所以直接调用会报找不到宏的错误。不过我们有两种方式处理,不用非得把Hyper作为独立依赖引入(或者说可以间接导入使用):

方式1:用Reqwest自带的Header API替代header!

这是Reqwest官方更推荐的方式,避免版本兼容问题,也更贴合Reqwest的使用习惯。如果要定义自定义标头,可以直接用HeaderNameHeaderValue来构建,示例代码如下:

use reqwest::header::{HeaderMap, HeaderName, HeaderValue};

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    // 创建自定义标头集合
    let mut custom_headers = HeaderMap::new();
    custom_headers.insert(
        // 静态字符串定义标头名称,也可以用from_str动态解析
        HeaderName::from_static("x-my-custom-header"),
        HeaderValue::from_static("my-custom-value"),
    );

    // 发送请求时带上自定义标头
    let client = reqwest::Client::new();
    let response = client.get("https://example.com")
        .headers(custom_headers)
        .send()
        .await?;

    println!("Response status: {}", response.status());
    Ok(())
}

方式2:间接导入Hyper的header!

如果一定要用Hyper的header!宏,你不需要把Hyper作为独立的“顶层”依赖引入,但需要在Cargo.toml中明确指定和Reqwest依赖的Hyper完全一致的版本(避免版本冲突),然后通过路径导入使用:

  1. 先查看你的项目Cargo.lock文件,找到Reqwest依赖的Hyper版本号(比如常见的0.14.27
  2. Cargo.toml中添加Hyper依赖(指定对应版本,可关闭默认特性减少编译体积):
[dependencies]
reqwest = { version = "0.11", features = ["tokio-rustls"] }
# 版本号必须和Reqwest依赖的Hyper一致
hyper = { version = "0.14.27", default-features = false }
  1. 在代码中导入并使用宏:
use hyper::header;

// 用header!宏定义自定义标头
header! { (XMyCustomHeader, "X-My-Custom-Header") => [String] }

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = reqwest::Client::new();
    let response = client.get("https://example.com")
        .header(XMyCustomHeader("test-value".to_string()))
        .send()
        .await?;

    println!("Response status: {}", response.status());
    Ok(())
}

注意事项

  • 尽量优先使用方式1,因为Reqwest的header模块已经封装了Hyper的相关功能,更稳定,也不用操心版本匹配的问题
  • 如果用方式2,一定要保证Hyper的版本和Reqwest依赖的完全一致,否则会出现编译错误

内容的提问来源于stack exchange,提问作者user1560585

火山引擎 最新活动