#http #request-response #type #response-headers #response #request #http-body

http-types-red-badger-temporary-fork

HTTP操作常见类型

1个稳定版本

2.12.0 2024年2月2日

#531HTTP客户端

Download history 276/week @ 2024-04-09 196/week @ 2024-04-16 299/week @ 2024-04-23 270/week @ 2024-04-30 122/week @ 2024-05-07 404/week @ 2024-05-14 566/week @ 2024-05-21 325/week @ 2024-05-28 236/week @ 2024-06-04 237/week @ 2024-06-11 121/week @ 2024-06-18 186/week @ 2024-06-25 192/week @ 2024-07-02 259/week @ 2024-07-09 196/week @ 2024-07-16 235/week @ 2024-07-23

924 每月下载量
2 个crates中使用(通过 crux_http

MIT/Apache

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协议。客户端创建一个包含 RequestUrlMethodHeaders 和可选的 Body 的请求并发送到服务器。然后服务器解码此 Request,执行一些工作,并发送回一个 Response

Url 作为一个将IP地址/域名进一步划分为可寻址资源的方式。 Method 指示我们试图执行的操作类型(获取某物、提交某物、更新某物等)

  Request
|-----------------|
| Url             |
| Method          |
| Headers         |
|-----------------|
| Body (optional) |
|-----------------|

一个 Response 由一个 StatusCodeHeaders 以及可选的 Body 组成。客户端随后对 Response 进行解码,然后可以对其进行操作。通常它首先检查状态码以确定其 Request 是否成功,然后继续处理头部的信息。

     Response
|-----------------|
| StatusCode      |
| Headers         |
|-----------------|
| Body (optional) |
|-----------------|

RequestResponse 都包含 Headers。这就像是 HTTP 请求的关键值元数据。它需要以特定方式编码(所有小写 ASCII,仅允许某些特殊字符),因此我们使用 HeaderNameHeaderValue 结构体而不是字符串来确保这一点。关于这一点另一个有趣的地方是,同一个头名称可以有多个实例。这就是为什么 Headers 允许多次插入值,并且对于每个键始终返回一个 Vec 的头。

在研究 HTTP 时,你可能会经常听到很多与底层协议相关的术语。但即使是新的 HTTP 版本(HTTP/2HTTP/3),仍然基本上使用我们之前描述的请求/响应模型。

Body 类型

在 HTTP 中,Body 类型是可选的。一个 Body 的内容是一个具有特定编码的字节流;这个编码是它的 Mime 类型。可以使用 set_content_type 方法设置 Mime,并且有许多不同的 Mime 类型。

http-typesBody 结构体可以接受任何实现了 AsyncBufRead 的东西,并将其流式传输出去。根据使用的 HTTP 版本,底层字节将被以不同的方式传输。一般来说,如果你知道身体的大小,通常最好提前声明它。但如果你不知道,事情仍然可以工作。

依赖

~4–18MB
~223K SLoC