10 个版本

新版本 0.4.0 2024年8月17日
0.3.3 2022年11月4日
0.3.2 2022年1月11日
0.2.2 2022年1月6日
0.1.1 2020年3月16日

#338网页编程

Download history 7663/week @ 2024-04-27 7387/week @ 2024-05-04 6977/week @ 2024-05-11 9685/week @ 2024-05-18 6920/week @ 2024-05-25 6392/week @ 2024-06-01 6388/week @ 2024-06-08 6851/week @ 2024-06-15 5699/week @ 2024-06-22 5541/week @ 2024-06-29 6035/week @ 2024-07-06 5445/week @ 2024-07-13 7822/week @ 2024-07-20 6208/week @ 2024-07-27 6261/week @ 2024-08-03 6223/week @ 2024-08-10

27,217 每月下载量
用于 36 个 crates (29 直接)

MIT 许可证

25KB
319 行(不包括注释)

parse_link_header

Rust codecov Crates.io Crates.io

解析 HTTP Link 标头的库。

使用方法

0.1.x 版本说明

0.1 版本无法正确处理在 https://tools.ietf.org/html/rfc3986#section-4.1 中描述的 relative ref

0.1 版本的解析值引用了 https://github.com/thlorenz/parse-link-header 的返回值,这是一个具有相同结构的 HashMap

所以如果你想解析 relative ref,请使用版本 >=0.2

或者如果你不关心 relative ref 并且想要一个简单的 HashMap<String, HashMap<String, String>> 结果,你可以使用版本 0.1

示例

在您的 Cargo.toml 文件中添加

[dependencies]
parse_link_header = "0.4"

然后

let link_header = r#"<https://api.github.com/repositories/41986369/contributors?page=2>; rel="next", <https://api.github.com/repositories/41986369/contributors?page=14>; rel="last""#;

let res = parse_link_header::parse(link_header);
assert!(res.is_ok());

let val = res.unwrap();
assert_eq!(val.len(), 2);
assert_eq!(val.get(&Some("next".to_string())).unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=2");
assert_eq!(val.get(&Some("last".to_string())).unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=14");

解析值是一个 Result<HashMap<Option<Rel>, Link>, Error>(即一个 LinkMap),其中 RelLink

use std::collections::HashMap;

#[cfg(not(feature = "url"))]
use http::Uri;

#[cfg(feature = "url")]
use url::Url as Uri;

#[derive(Debug, PartialEq)]
pub struct Link {
    pub uri: Uri,
    pub raw_uri: String,
    pub queries: HashMap<String, String>,
    pub params: HashMap<String, String>,
}

type Rel = String;

请注意,根据https://tools.ietf.org/html/rfc8288#section-3.3(2017年10月),rel参数必须存在。这就是为什么HashMap<Option<Rel>, Link>的键是Option<Rel>。因此,如果您发现键是None,请检查您是否指定了rel类型。

parse_with_rel

版本 >= 0.3.0

或者,使用parse_with_rel()函数来获取一个HashMap<String, Link>(即RelLinkMap),如下所示:

let link_header = r#"<https://api.github.com/repositories/41986369/contributors?page=2>; rel="next", <https://api.github.com/repositories/41986369/contributors?page=14>; rel="last""#;

let res = parse_link_header::parse_with_rel(link_header);
assert!(res.is_ok());

let val = res.unwrap();
assert_eq!(val.len(), 2);
assert_eq!(val.get("next").unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=2");
assert_eq!(val.get("last").unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=14");

如果您确保头中存在rel参数,则可以使用此函数。

特性: url

版本 >= 0.3.0

如果启用了url功能,结构体parse_link_header::Link中的uri字段将是从url crateurl::Url类型,而不是通常的http::uri::Uri类型。这允许与其他使用url crate的库进行集成,例如reqwest

注意:这隐式禁用了对相对引用的支持,因为URL不支持相对引用(而URI支持)。

如何贡献

提交一个请求或创建一个问题来描述您的更改或问题。

许可证

MIT @ g1eny0ung

依赖项

~2.6–4MB
~70K SLoC