一様リソースロケーション
文字列から URL を Url 型に解析する
url クレートの parse メソッドは、&str を検証して Url 構造体に解析します。入力文字列は不正な形式である可能性があるため、このメソッドは Result<Url, ParseError> を返します。
URL が解析されると、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(())
}
パスセグメントを削除してベース URL を作成する
ベース URL にはプロトコルとドメインが含まれます。ベース URL にはフォルダー、
ファイル、クエリ文字列はありません。これらの各項目は、指定された
URL から取り除かれます。PathSegmentsMut::clear はパスを削除し、Url::set_query は
クエリ文字列を削除します。
use anyhow::{Result, anyhow};
use url::Url;
fn main() -> 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(anyhow!("Cannot be a base URL"));
}
}
url.set_query(None);
Ok(url)
}
ベース URL から新しい URL を作成する
join メソッドは、ベース URL と相対パスから新しい 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 から情報を抽出するためのさまざまなメソッドを公開しています。
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 は同じ結果を生成します。
use anyhow::Result;
use url::{Url, Origin, Host};
fn main() -> 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(())
}
URL からフラグメント識別子とクエリペアを削除する
Url を解析し、url::Position でスライスして不要な 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(())
}