在開發Web應用程式的時候,為了要讓應用程式可以被設定在不同網域,或是不同的網址目錄下,通常會需要對應用程式進行「網址前綴」的設定。舉例來說,如果要把某個Web應用程式運作在「tool.magiclen.org」這個網域的「url」路徑下,我們可以將「https://tool.magiclen.org/url」這個「網址前綴」設定給該Web應用程式,讓它知道如何去正確處理它所用到的其它資源的路徑。例如它有某個資源的路徑為「images/logo.jpg」,有了「網址前綴」的資料之後,該Web應用程式就知道要連結到「images/logo.jpg」資源的網址是「https://tool.magiclen.org/url/images/logo.jpg」了!



但是由於我們的網址有「通訊協定」(protocol)的存在,且連線也可以透過多個不同的「連接埠」(port),因此在進行「網址前綴」的產生時,並不是直接把通訊協定、網域和路徑串接在一起就好了。舉例來說,HTTPS協定預設使用「443」連接埠,如果我們要使用其它連接埠的話,例如444,則必須要將網址寫成「https://tool.magiclen.org:444/url」;可是如果連接埠就是使用預設的「443」,我們通常不會將網址寫成「https://tool.magiclen.org:443/url」,因為它實在不太好看。

為了處理預設連接埠的問題,我們會寫出以下這樣的程式:

let mut url_prefix = String::new();
if is_https {
    url_prefix.push_str("https://");
} else {
    url_prefix.push_str("http://");
}
url_prefix.push_str(domain);

if is_https && port != 443 || !is_https && port != 80{
    url_prefix.push_str(":");
    url_prefix.push_str(&port.to_string());
}

if let Some(path) = path {
    if !path.starts_with("/") {
        url_prefix.push_str("/");
    }
    url_prefix.push_str("path");
}

以上的程式是讓使用者分別輸入該Web應用程式有沒有透過HTTPS協定來連線(is_https),以及其所在的網域名稱(domain)和路徑(path)來組成「網址前綴」(url_prefix)。

當然,您也可以讓使用者直接輸入完整的「網址前綴」,只是這樣可能就需要再用其它程式去驗證使用者輸入的「網址前綴」是否合法,且通訊協定、網域、連接埠、路徑等等的資訊可能也還要透過解析使用者輸入的「網址前綴」才能得到。兩種方式的效果都差不多,不過筆者比較偏好前者一開始就把各個資訊拆開設定,再由應用程式來組成「網址前綴」的方式,程式實作起來會比較簡單一點。

URL Prefix

因為每次新開一個Web應用程式專案,幾乎都要撰寫上述提到的「網址前綴」產生程式。所以筆者開發了「URL Prefix」套件,提供了create_prefix函數來產生「網址前綴」。

Crates.io

Cargo.toml

url-prefix = "*"

使用方法

url_prefix這個crate底下的create_prefix函數還必須搭配其中的Protocol列舉。

用法如下:

let prefix = url_prefix::create_prefix(url_prefix::Protocol::HTTPS, "magiclen.org", Some(8100), Some("url-prefix"));

assert_eq!("https://magiclen.org:8100/url-prefix", prefix);

當輸入的連接埠並不是通訊協定的預設連接埠時,「網址前綴」中才會明確地包含連接埠。