1个稳定版本
2.12.0 | 2024年2月2日 |
---|
#531 在 HTTP客户端
924 每月下载量
在 2 个crates中使用(通过 crux_http)
1MB
11K SLoC
http-types的维护分支
不要使用。当不再需要时,将撤回
lib.rs
:
HTTP操作常见类型。
http-types
提供了HTTP操作的共享类型。它结合了高性能的流接口和方便创建标题、URL和其他标准HTTP类型的常用方法。
示例
#
use http_types::{Method, Request, Response, StatusCode};
let mut req = Request::new(Method::Get, "https://example.com");
req.set_body("Hello, Nori!");
let mut res = Response::new(StatusCode::Ok);
res.set_body("Hello, Chashu!");
#
HTTP是如何工作的?
在这里无法解释 所有 的HTTP:现在有 5个版本的协议,以及许多扩展。但是,在其核心,只有少数概念需要了解才能理解此crate的功能。
request
client ----------> server
<----------
response
HTTP是一个 RPC协议。客户端创建一个包含 Request
、Url
、Method
、Headers
和可选的 Body
的请求并发送到服务器。然后服务器解码此 Request
,执行一些工作,并发送回一个 Response
。
Url
作为一个将IP地址/域名进一步划分为可寻址资源的方式。 Method
指示我们试图执行的操作类型(获取某物、提交某物、更新某物等)
Request
|-----------------|
| Url |
| Method |
| Headers |
|-----------------|
| Body (optional) |
|-----------------|
一个 Response
由一个 StatusCode
、Headers
以及可选的 Body
组成。客户端随后对 Response
进行解码,然后可以对其进行操作。通常它首先检查状态码以确定其 Request
是否成功,然后继续处理头部的信息。
Response
|-----------------|
| StatusCode |
| Headers |
|-----------------|
| Body (optional) |
|-----------------|
Request
和 Response
都包含 Headers
。这就像是 HTTP 请求的关键值元数据。它需要以特定方式编码(所有小写 ASCII,仅允许某些特殊字符),因此我们使用 HeaderName
和 HeaderValue
结构体而不是字符串来确保这一点。关于这一点另一个有趣的地方是,同一个头名称可以有多个实例。这就是为什么 Headers
允许多次插入值,并且对于每个键始终返回一个 Vec
的头。
在研究 HTTP 时,你可能会经常听到很多与底层协议相关的术语。但即使是新的 HTTP 版本(HTTP/2
,HTTP/3
),仍然基本上使用我们之前描述的请求/响应模型。
Body 类型
在 HTTP 中,Body
类型是可选的。一个 Body
的内容是一个具有特定编码的字节流;这个编码是它的 Mime
类型。可以使用 set_content_type
方法设置 Mime
,并且有许多不同的 Mime
类型。
http-types
的 Body
结构体可以接受任何实现了 AsyncBufRead
的东西,并将其流式传输出去。根据使用的 HTTP 版本,底层字节将被以不同的方式传输。一般来说,如果你知道身体的大小,通常最好提前声明它。但如果你不知道,事情仍然可以工作。
依赖
~4–18MB
~223K SLoC