2013-08-18 135 views
1

我必須使用動態查詢字符串構建URI地址,並尋找通過代碼構建它們的舒適方法。使用http客戶端API構建URI

我瀏覽了System.Net.Http程序集,但沒有發現這種情況下的類或方法。這個API不提供這個嗎?我在StackOverflow的搜索結果使用了System.Web中的HttpUtility類,但我不想在我的類庫中引用任何ASP.Net組件。

我需要這樣一個URI:http://www.myBase.com/get?a=1&b=c

在此先感謝您的幫助!

更新(2013年9月8日):

我的解決方案是創建一個使用System.Net.WebUtilitiy類編碼值的URI生成器(進口NuGet包遺憾的是沒有提供強名稱鍵)。 這裏是我的代碼:

/// <summary> 
/// Helper class for creating a URI with query string parameter. 
/// </summary> 
internal class UrlBuilder 
{ 
    private StringBuilder UrlStringBuilder { get; set; } 
    private bool FirstParameter { get; set; } 

    /// <summary> 
    /// Creates an instance of the UriBuilder 
    /// </summary> 
    /// <param name="baseUrl">the base address (e.g: http://localhost:12345)</param> 
    public UrlBuilder(string baseUrl) 
    { 
     UrlStringBuilder = new StringBuilder(baseUrl); 
     FirstParameter = true; 
    } 

    /// <summary> 
    /// Adds a new parameter to the URI 
    /// </summary> 
    /// <param name="key">the key </param> 
    /// <param name="value">the value</param> 
    /// <remarks> 
    /// The value will be converted to a url valid coding. 
    /// </remarks> 
    public void AddParameter(string key, string value) 
    { 
     string urlEncodeValue = WebUtility.UrlEncode(value); 

     if (FirstParameter) 
     { 
      UrlStringBuilder.AppendFormat("?{0}={1}", key, urlEncodeValue); 
      FirstParameter = false; 
     } 
     else 
     { 
      UrlStringBuilder.AppendFormat("&{0}={1}", key, urlEncodeValue); 
     } 

    } 

    /// <summary> 
    /// Gets the URI with all previously added paraemter 
    /// </summary> 
    /// <returns>the complete URI as a string</returns> 
    public string GetUrl() 
    { 
     return UrlStringBuilder.ToString(); 
    } 
} 

希望這有助於在這裏有人在StackOverflow上。我的請求正在工作。

比約恩

+0

也許這http://msdn.microsoft.com/en-us/ library/system.uri.aspx –

+0

也許'System.Net.WebUtility'? – I4V

+0

System.Net.WebUtility可以幫助我將字符串解碼爲有效的URI。但是我仍然需要自己創建URL,對嗎? – Bjoern

回答

2

如果採取Tavis.Link的依賴,你可以使用URI Templates來指定參數。

[Fact] 
    public void SOQuestion18302092() 
    { 
     var link = new Link(); 
     link.Target = new Uri("http://www.myBase.com/get{?a,b}"); 

     link.SetParameter("a","1"); 
     link.SetParameter("b", "c"); 

     var request = link.CreateRequest(); 
     Assert.Equal("http://www.myBase.com/get?a=1&b=c", request.RequestUri.OriginalString); 


    } 

有,你可以與Tavis.Link在Github上repo做一些更多的例子。

0

查詢字符串:

要寫入數據:

Server.Transfer("WelcomePage.aspx?FirstName=" + Server.UrlEncode(fullName[0].ToString()) + 
             "&LastName=" + Server.UrlEncode(fullName[1].ToString())); 

要獲取寫入的數據:

Server.UrlDecode(Request.QueryString["FirstName"].ToString()) + " " 
               + Server.UrlDecode(Request.QueryString["LastName"].ToString()); 
+0

如果您有特定的代碼或特定的要求,請在此處註明它們。 – Jacob

2

Flurl [披露:我是作者]是便攜式類庫運動用於構建一個流利API和(可選地)調用的URL:

using Flurl; 
using Flurl.Http; // if you need it 

var url = "http://www.myBase.com" 
    .AppendPathSegment("get") 
    .SetQueryParams(new { a = 1, b = "c" }) // multiple 
    .SetQueryParams(dict)     // multiple with an IDictionary 
    .SetQueryParam("name", "value")   // one by one 

    // if you need to call the URL with HttpClient... 

    .WithOAuthBearerToken("token") 
    .WithHeaders(new { a = "x", b = "y" }) 
    .ConfigureHttpClient(client => { /* access HttpClient directly */ }) 
    .PostJsonAsync(new { first_name = firstName, last_name = lastName }); 

查詢字符串的值是URL編碼在每種情況下。 Flurl還包括一套漂亮的HTTP testing features。全包,請訪問的NuGet:

PM> Install-Package Flurl.Http

或僅僅是獨立的URL生成器:

PM> Install-Package Flurl

+0

幹得好!我會嘗試在我的oss項目中使用它 –