如何仅使用http crate发送HTTP请求?
问题解答:如何发送http crate构建的Request
首先明确:http crate本身不具备发送HTTP请求的网络能力,它的定位是提供HTTP协议的核心抽象(比如Request、Response、HeaderMap等类型),专注于消息的结构定义与构建,不涉及实际的网络传输逻辑。
你看到的示例中的send函数是一个占位符,它需要你基于具体的网络客户端实现,或者直接使用成熟的HTTP客户端库(比如你提到的hyper)来完成请求发送。
可行方案:结合hyper发送http crate构建的Request
既然你已经熟悉hyper,其实可以直接用它来发送你用http crate构建好的Request,两者的类型是兼容的。修改你的代码如下:
use http::{Request, Response}; use hyper::{Body, Client}; use hyper_tls::HttpsConnector; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // 构建支持HTTPS的客户端 let https = HttpsConnector::new(); let client = Client::builder().build::<_, Body>(https); // 用http crate构建Request,注意body需要换成hyper的Body类型 let request = Request::builder() .method("GET") .uri("https://api.spotify.com/v1/search?q=system+overload") .header("artist", "smash stereo") .body(Body::empty())?; // 发送请求并获取响应 let response: Response<Body> = client.request(request).await?; println!("响应状态码: {:?}", response.status()); println!("响应头: {:?}", response.headers()); // 读取响应体 let body = hyper::body::to_bytes(response.into_body()).await?; println!("响应体: {}", String::from_utf8_lossy(&body)); Ok(()) }
需要在Cargo.toml中添加依赖:
[dependencies] http = "1.0" hyper = "1.1" hyper-tls = "0.6" tokio = { version = "1.0", features = ["full"] }
为什么不能“仅用http crate”发送请求?
如果一定要完全基于http crate实现请求发送,你需要自己完成以下工作:
- 建立TCP/TLS连接到目标服务器
- 将
Request实例序列化为符合HTTP协议规范的字节流 - 发送字节流到服务器
- 读取服务器返回的字节流
- 将字节流反序列化为
Response实例
这相当于从零实现一个HTTP客户端,工作量大且容易出错,完全没必要——hyper这类库已经封装了所有底层网络细节,并且和http crate的抽象完全兼容,是更高效的选择。
内容的提问来源于stack exchange,提问作者faervan
相关产品推荐
相关产品推荐

