#parse-url #parser #whatwg #standard

url

Rust的URL库,基于WHATWG URL标准

82个版本 (31个稳定版)

2.5.2 2024年6月18日
2.5.0 2023年11月22日
2.4.0 2023年6月5日
2.3.1 2022年9月8日
0.2.1 2014年11月24日

#5 in 解析器实现

Download history 1788416/week @ 2024-05-04 1874739/week @ 2024-05-11 1845327/week @ 2024-05-18 1834184/week @ 2024-05-25 2004404/week @ 2024-06-01 2187188/week @ 2024-06-08 2144339/week @ 2024-06-15 2140007/week @ 2024-06-22 1976039/week @ 2024-06-29 2203035/week @ 2024-07-06 2117212/week @ 2024-07-13 2186533/week @ 2024-07-20 2158351/week @ 2024-07-27 2194741/week @ 2024-08-03 2268961/week @ 2024-08-10 1837772/week @ 2024-08-17

8,822,888 个月下载量
用于 27,661 个crate (5,922 直接)

MIT/Apache

355KB
6K SLoC

rust-url

Build status Coverage Chat License: MIT License: Apache 2.0

Rust的URL库,基于URL标准

文档

如果您是从旧版本升级,请参阅UPGRADING.md


lib.rs:

rust-url是针对Rust编程语言的URL标准的实现。

URL解析和数据结构

首先,URL解析可能会因各种原因失败,因此返回一个Result

use url::{Url, ParseError};

assert!(Url::parse("http://[:::1]") == Err(ParseError::InvalidIpv6Address))

让我们解析一个有效的URL并查看其组件。

use url::{Url, Host, Position};
let issue_list_url = Url::parse(
"https://github.com/rust-lang/rust/issues?labels=E-easy&state=open"
)?;


assert!(issue_list_url.scheme() == "https");
assert!(issue_list_url.username() == "");
assert!(issue_list_url.password() == None);
assert!(issue_list_url.host_str() == Some("github.com"));
assert!(issue_list_url.host() == Some(Host::Domain("github.com")));
assert!(issue_list_url.port() == None);
assert!(issue_list_url.path() == "/rust-lang/rust/issues");
assert!(issue_list_url.path_segments().map(|c| c.collect::<Vec<_>>()) ==
Some(vec!["rust-lang", "rust", "issues"]));
assert!(issue_list_url.query() == Some("labels=E-easy&state=open"));
assert!(&issue_list_url[Position::BeforePath..] == "/rust-lang/rust/issues?labels=E-easy&state=open");
assert!(issue_list_url.fragment() == None);
assert!(!issue_list_url.cannot_be_a_base());

有些URL被称为不能作为基础:它们没有用户名、密码、主机或端口,它们的“路径”是一个任意字符串,而不是由斜杠分隔的段

use url::Url;

let data_url = Url::parse("data:text/plain,Hello?World#")?;

assert!(data_url.cannot_be_a_base());
assert!(data_url.scheme() == "data");
assert!(data_url.path() == "text/plain,Hello");
assert!(data_url.path_segments().is_none());
assert!(data_url.query() == Some("World"));
assert!(data_url.fragment() == Some(""));

Serde

启用serde特性以包含对DeserializeSerialize的实现在url::Url上。

基本URL

许多上下文允许URL引用相对于一个基本URL是相对的

<link rel="stylesheet" href="../main.css">

由于解析的URL是绝对的,因此在解析相对URL时需要提供基本URL

use url::{Url, ParseError};

assert!(Url::parse("../main.css") == Err(ParseError::RelativeUrlWithoutBase))

使用join方法在Url上使用它作为基本URL

use url::Url;

let this_document = Url::parse("http://servo.github.io/rust-url/url/index.html")?;
let css_url = this_document.join("../main.css")?;
assert_eq!(css_url.as_str(), "http://servo.github.io/rust-url/main.css");

特性: serde

如果您启用了 serde 功能,Url 将实现 serde::Serializeserde::Deserialize。有关更多信息,请参阅 serde 文档

url = { version = "2", features = ["serde"] }

功能: debugger_visualizer

如果您启用了 debugger_visualizer 功能,url 包将包含一个用于 natvis 文件,该文件允许您在 Visual Studio 中查看 Url 对象。

此功能需要 Rust 1.71 或更高版本。

url = { version = "2", features = ["debugger_visualizer"] }

依赖关系

~0.7–1.1MB
~47K SLoC