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