Saltar al contenido

Cómo construir una consulta string para una URL en C#?

Estate atento ya que en este escrito encontrarás la respuesta que buscas.Este artículo fue probado por nuestros expertos para garantizar la calidad y veracidad de nuestro contenido.

Solución:

Puede crear una nueva instancia escribible de HttpValueCollection llamando System.Web.HttpUtility.ParseQueryString(string.Empty)y luego utilícelo como cualquier NameValueCollection. Una vez que haya agregado los valores que desea, puede llamar ToString en la colección para obtener una consulta stringcomo sigue:

NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);

queryString.Add("key1", "value1");
queryString.Add("key2", "value2");

return queryString.ToString(); // Returns "key1=value1&key2=value2", all URL-encoded

los HttpValueCollection es interno y, por lo tanto, no puede construir directamente una instancia. Sin embargo, una vez que obtenga una instancia, puede usarla como cualquier otra NameValueCollection. Dado que el objeto real con el que está trabajando es un HttpValueCollectionllamar al método ToString llamará al método anulado en HttpValueCollectionque da formato a la colección como una consulta codificada en URL string.

Después de buscar en SO y en la web una respuesta a un problema similar, esta es la solución más simple que pude encontrar.

Núcleo de .NET

Si está trabajando en .NET Core, puede usar el Microsoft.AspNetCore.WebUtilities.QueryHelpers class, lo que simplifica esto enormemente.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webutilities.queryhelpers

Código de muestra:

const string url = "https://customer-information.azure-api.net/customers/search/taxnbr";
var param = new Dictionary()   "CIKey", "123456789"  ;

var newUrl = new Uri(QueryHelpers.AddQueryString(url, param));

Si mira debajo del capó, la propiedad QueryString es una NameValueCollection. Cuando hice cosas similares, generalmente me interesó serializar Y deserializar, por lo que mi sugerencia es crear una NameValueCollection y luego pasar a:

using System.Linq;
using System.Web;
using System.Collections.Specialized;

private string ToQueryString(NameValueCollection nvc)

    var array = (
        from key in nvc.AllKeys
        from value in nvc.GetValues(key)
            select string.Format(
                "0=1",
                HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(value))
        ).ToArray();
    return "?" + string.Join("&", array);

Me imagino que también hay una manera súper elegante de hacer esto en LINQ…

Con la inspiración del comentario de Roy Tinker, terminé usando un método de extensión simple en la clase Uri que mantiene mi código conciso y limpio:

using System.Web;

public static class HttpExtensions

    public static Uri AddQuery(this Uri uri, string name, string value)
    
        var httpValueCollection = HttpUtility.ParseQueryString(uri.Query);

        httpValueCollection.Remove(name);
        httpValueCollection.Add(name, value);

        var ub = new UriBuilder(uri);
        ub.Query = httpValueCollection.ToString();

        return ub.Uri;
    

Uso:

Uri url = new Uri("http://localhost/rest/something/browse").
          AddQuery("page", "0").
          AddQuery("pageSize", "200");

Editar: variante compatible con los estándares

Como varias personas señalaron, httpValueCollection.ToString() codifica caracteres Unicode de una manera que no cumple con los estándares. Esta es una variante del mismo método de extensión que maneja dichos caracteres invocando HttpUtility.UrlEncode método en lugar del obsoleto HttpUtility.UrlEncodeUnicode método.

using System.Web;

public static Uri AddQuery(this Uri uri, string name, string value)

    var httpValueCollection = HttpUtility.ParseQueryString(uri.Query);

    httpValueCollection.Remove(name);
    httpValueCollection.Add(name, value);

    var ub = new UriBuilder(uri);

    // this code block is taken from httpValueCollection.ToString() method
    // and modified so it encodes strings with HttpUtility.UrlEncode
    if (httpValueCollection.Count == 0)
        ub.Query = String.Empty;
    else
    
        var sb = new StringBuilder();

        for (int i = 0; i < httpValueCollection.Count; i++)
        
            string text = httpValueCollection.GetKey(i);
             vals.Length == 0)
                    sb.Append(val);
                else
                
                    if (vals.Length == 1)
                    
                        sb.Append(val);
                        sb.Append(HttpUtility.UrlEncode(vals[0]));
                    
                    else
                    
                        for (int j = 0; j < vals.Length; j++)
                        
                            if (j > 0)
                                sb.Append('&');

                            sb.Append(val);
                            sb.Append(HttpUtility.UrlEncode(vals[j]));
                        
                    
                
            
        

        ub.Query = sb.ToString();
    

    return ub.Uri;

Aquí tienes las reseñas y valoraciones

Recuerda algo, que tienes permiso de agregar una reseña si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *