#template #uri #matching #expansion #rfc #routing #web-apps

uri-template-system

URI模板(RFC 6570)解析、扩展和匹配

6个版本

0.1.5 2023年8月24日
0.1.4 2023年8月24日

#170 in 模板引擎

每月39次下载

AGPL-3.0-only

63KB
1.5K SLoC

uri-template-system

GitHub docs.rs Crates Continuous Integration Issues Sponsors

URI模板(RFC6570)是Web编程中一个被低估的工具。它规范了URI和相关表单的构建,消除了对临时字符串操作的需求,并有助于在复杂的Web应用程序中提供一致性。

use uri_template_system_core::{ Template, Value, Values };

let template = Template::parse("/hello/{name}/from{/library*}").unwrap();
let values = Values::default()
    .add("name", Value::item("world"))
    .add("library", Value::list(["uri", "template", "system"]));

assert_eq!(
    template.expand(&values).unwrap(),
    "/hello/world/from/uri/template/system"
);

超出RFC本身的范围,它们也可以(经过一些判断)用于匹配URI和相关表单,实际上为从相同数据驱动的链接机制提供了基础,从而实现路由机制。不再有链接和路由之间的不匹配。

范围

此库提供了一个符合RFC并通过了解析和扩展标准测试用例的URI模板实现。

未来的迭代将扩展此功能,提供对单个和多个URI模板的匹配,基于URI模板匹配的路由,以及对强类型模板数据的支持。请参阅里程碑以获取最新进展和更多计划功能的详细描述。

目标

现有的URI模板实现存在于Rust中,特别是rust-uritemplate和该实现的各个分支,以及iri-string库中的实现。

本实现旨在既更加“正确”(解析器在遵守RFC方面故意比较严格,而现有实现允许一些格式错误的模板通过为有效)又在底层表示方面更加结构化(旨在使匹配等附加功能更易于处理)。性能同样重要,且该实现大致与iri-stringrust-uritemplate的派生具有不同的编程模型,但即便考虑到这一点,它们通常要慢得多)相当,或者略快。

基准和RFC合规性测试(以及测试工具)可以在tests目录中找到——和往常一样,基准是具有指示性的,但在实际条件下的性能总是会变化。

依赖项

约280–740KB
约17K SLoC