2013-08-18 1 views
1

Je dois créer une adresse URI avec des chaînes de requête dynamiques et rechercher un moyen confortable de les générer via le code. J'ai parcouru l'assembly System.Net.Http mais je n'ai pas trouvé de classe ou de méthode pour ce cas. Est-ce que cette API ne fournit pas cela? Mes résultats de recherche ici sur StackOverflow utilisent la classe HttpUtility de System.Web, mais je ne veux pas référencer les composants ASP.Net dans ma bibliothèque de classes. J'ai besoin d'un URI comme ceci: http://www.myBase.com/get?a=1&b=c.Création d'un URI avec l'API client http

Merci d'avance pour votre aide!

Mise à jour (08/09/2013):

Ma solution a été de créer un URI constructeur qui utilise la classe System.Net.WebUtilitiy pour coder les valeurs (malheureusement, le paquet NuGet importé n'a pas fourni un nom fort clé). Voici mon code:

/// <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(); 
    } 
} 

Hope this helps quelqu'un ici à StackOverflow. Ma demande fonctionne.

Björn

+0

Peut-être que ce http://msdn.microsoft.com/en-us/ library/system.uri.aspx –

+0

peut-être 'System.Net.WebUtility'? – I4V

+0

Le System.Net.WebUtility pourrait m'aider à décoder la chaîne à un URI valide. Mais je dois encore construire l'URL par moi-même, non? – Bjoern

Répondre

2

Si vous prenez une dépendance à l'Tavis.Link vous pouvez utiliser URI Templates pour spécifier les paramètres.

[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); 


    } 

Il y a quelques exemples de ce que vous pouvez faire avec Tavis.Link sur le Github repo.

0

chaîne de requête:

Pour écrire des données:

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

Pour obtenir les données écrites:

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

Si vous avez un code spécifique ou des exigences spécifiques, veuillez les noter ici. – Jacob

2

Flurl [divulgation: Je suis l'auteur] est une bibliothèque de classe portable arborant une API couramment pour la construction et (éventuellement) URL Vocation:

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 }); 

valeurs queryString sont encodées dans chaque cas. Flurl également inclus est un ensemble astucieux de HTTP testing features. Le package complet est disponible sur NuGet:

PM> Install-Package Flurl.Http

ou tout simplement le constructeur URL autonome:

PM> Install-Package Flurl

+0

Bon travail homme !! Je vais essayer d'utiliser ceci sur mon projet oss –