16 个版本
使用旧的 Rust 2015
0.4.0 | 2023年11月24日 |
---|---|
0.3.8 | 2022年9月2日 |
0.3.7 | 2022年2月10日 |
0.3.5 | 2021年10月18日 |
0.1.0 | 2016年8月9日 |
#15 in 网络编程
1,814,362 每月下载量
用于 1,322 个工具包 (160 直接)
315KB
6K SLoC
Rust HTTP 标头
类型化的 HTTP 标头。
lib.rs
:
类型化的 HTTP 标头
Hyper 认为 HTTP 标头应该是强类型化的,这正是我们使用 Rust 的原因。要设置或获取任何标头,对象必须实现此模块中的 Header
特性。已提供一些常用标头,例如 Host
、ContentType
、UserAgent
等。
为什么是类型化的?
或者,为什么不使用字符串类型化?类型化提供了以下优势
- 更难出现拼写错误,因为类型错误应该由编译器捕获
- 默认情况下解析到正确的类型
定义自定义标头
实现 Header
特性
考虑一个 Do Not Track 标头。它可以是真的或假的,但它通过数字 1
和 0
来表示。
extern crate http;
extern crate headers;
use headers::{Header, HeaderName, HeaderValue};
struct Dnt(bool);
impl Header for Dnt {
fn name() -> &'static HeaderName {
&http::header::DNT
}
fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
where
I: Iterator<Item = &'i HeaderValue>,
{
let value = values
.next()
.ok_or_else(headers::Error::invalid)?;
if value == "0" {
Ok(Dnt(false))
} else if value == "1" {
Ok(Dnt(true))
} else {
Err(headers::Error::invalid())
}
}
fn encode<E>(&self, values: &mut E)
where
E: Extend<HeaderValue>,
{
let s = if self.0 {
"1"
} else {
"0"
};
let value = HeaderValue::from_static(s);
values.extend(std::iter::once(value));
}
}
依赖项
~1.5MB
~25K SLoC