统一资源位置
将字符串的一个 URL,解析为Url
类型
这个parse
方法,它来自url
箱子,用来验证并解析一个&str
,变为一个Url
结构。输入的字符串,可能格式不正确,因此,该方法返回Result<Url, ParseError>
.
一旦解析了 URL,它就可以使用Url
类型的所有方法。
extern crate url; use url::{Url, ParseError}; fn main() -> Result<(), ParseError> { let s = "https://github.com/rust-lang/rust/issues?labels=E-easy&state=open"; let parsed = Url::parse(s)?; println!("The path part of the URL is: {}", parsed.path()); Ok(()) }
通过移除路径段,创建一个 base URL
base URL 包括一个协议和一个域。base URL 没有文件夹、文件或查询字符串。这每一项都将从给定的 URL 中,剥离出来。PathSegmentsMut::clear
会删除路径,和Url::set_query
会删除查询字符串。
# #[macro_use] # extern crate error_chain; extern crate url; use url::Url; # # error_chain! { # foreign_links { # UrlParse(url::ParseError); # } # errors { # CannotBeABase # } # } fn run() -> Result<()> { let full = "https://github.com/rust-lang/cargo?asdf"; let url = Url::parse(full)?; let base = base_url(url)?; assert_eq!(base.as_str(), "https://github.com/"); println!("The base of the URL is: {}", base); Ok(()) } fn base_url(mut url: Url) -> Result<Url> { match url.path_segments_mut() { Ok(mut path) => { path.clear(); } Err(_) => { return Err(Error::from_kind(ErrorKind::CannotBeABase)); } } url.set_query(None); Ok(url) } # # quick_main!(run);
从一个 base URL ,创建新的 URL
这个join
方法,用 base 路径和相对路径,创建新的 URL。
extern crate url; use url::{Url, ParseError}; fn main() -> Result<(), ParseError> { let path = "/rust-lang/cargo"; let gh = build_github_url(path)?; assert_eq!(gh.as_str(), "https://github.com/rust-lang/cargo"); println!("The joined URL is: {}", gh); Ok(()) } fn build_github_url(path: &str) -> Result<Url, ParseError> { const GITHUB: &'static str = "https://github.com"; let base = Url::parse(GITHUB).expect("hardcoded URL is known to be valid"); let joined = base.join(path)?; Ok(joined) }
提取 URL 的源(协议方案名/主机/端口)
这个Url
结构,公有了各种方法,用来提取有关它所表示 URL 的信息。
extern crate url; use url::{Url, Host, ParseError}; fn main() -> Result<(), ParseError> { let s = "ftp://rust-lang.org/examples"; let url = Url::parse(s)?; assert_eq!(url.scheme(), "ftp"); assert_eq!(url.host(), Some(Host::Domain("rust-lang.org"))); assert_eq!(url.port_or_known_default(), Some(21)); println!("The origin is as expected!"); Ok(()) }
origin
产生相同的结果。
# #[macro_use] # extern crate error_chain; extern crate url; use url::{Url, Origin, Host}; # error_chain! { # foreign_links { # UrlParse(url::ParseError); # } # } # fn run() -> Result<()> { let s = "ftp://rust-lang.org/examples"; let url = Url::parse(s)?; let expected_scheme = "ftp".to_owned(); let expected_host = Host::Domain("rust-lang.org".to_owned()); let expected_port = 21; let expected = Origin::Tuple(expected_scheme, expected_host, expected_port); let origin = url.origin(); assert_eq!(origin, expected); println!("The origin is as expected!"); Ok(()) } # # quick_main!(run);
从 URL 中,删除片段标识符和查询对
解析Url
,并url::Position
把它切成片,删除不需要的 URL 部分。
extern crate url; use url::{Url, Position, ParseError}; fn main() -> Result<(), ParseError> { let parsed = Url::parse("https://github.com/rust-lang/rust/issues?labels=E-easy&state=open")?; let cleaned: &str = &parsed[..Position::AfterPath]; println!("cleaned: {}", cleaned); Ok(()) }