C# UriBuilder 介紹:自由的變更網址連結

平時可能會使用字串拼接的方式組裝網址,例如:
    
string baseUrl = $"https://ruyut.app/api";
string apiPath = "test/1";
string query1 = "a1";

string url = $"{baseUrl}/{apiPath}?q1={query1}";
Console.WriteLine(url);
// https://ruyut.app/api/test/1?q1=a1
    

但是常常會遇到到底要不要加斜線的問題,如果這些內容又是放在設定檔的話,無法確保使用者的輸入內容,在讀取參數時每項又要做檢查,非常繁瑣。

UriBuilder 連結組裝範例

下面是使用 UriBuilder 常用的 6 個屬性來設定連結:
    
UriBuilder urlBuilder = new UriBuilder
{
    Scheme = "https", // URL 協議
    Port = 8080, // 連接埠,可省略 (int)
    Host = "ruyut.app", // 主機、網域
    Path = "test/1", // 路徑
    Query = "q1=a1&q2=a2", // 查詢參數
    Fragment = "section1", // 內部連結、錨點
};

Console.WriteLine(urlBuilder.Uri);
// https://ruyut.app:8080/test/1?q1=a1&q2=a2#section1
    

另外 UriBuilder 還支援帳號密碼,對於需要身分驗證的 URL 來說非常好用
    
// 接續上面的程式碼

urlBuilder.UserName = "user"; // 使用者名稱
urlBuilder.Password = "password"; // 使用者密碼
Console.WriteLine(urlBuilder.Uri);

// https://user:password@ruyut.app:8080/test/1?q1=a1&q2=a2#section1
    

UriBuilder 變更網址

上面的建立連結都還好說,平時最討厭的就是替換部分內容,例如要讓 port 可以變更,又少不了一堆字串拼接。 不過 UriBuilder 最好用的就是替換了。任何部分都可以直接變更
    
string defaultUrl = "https://ruyut.app:8080/test/1?q1=a1&q2=a2#section1";
UriBuilder urlBuilder = new UriBuilder(defaultUrl);
urlBuilder.Scheme = "http";
urlBuilder.Port = 80;
urlBuilder.Host = "m.ruyut.app";
urlBuilder.Path = "api/test/1";
urlBuilder.Query = "qq=aa";
urlBuilder.Fragment = "title";

Console.WriteLine(defaultUrl);
// https://ruyut.app:8080/test/1?q1=a1&q2=a2#section1

Console.WriteLine(urlBuilder.Uri);
// http://m.ruyut.app/api/test/1?qq=aa#title
    

延伸閱讀: C# URI 介紹,網址拆分、拼接、URL encode, decode 教學

參考資料:
Microsoft.Learn - UriBuilder Class

留言