2010-05-21 38 views
89

Tengo una cadena URI como: http://example.com/file?a=1&b=2&c=string%20paramObtener los parámetros de consulta individuales de Uri

¿Hay una función existente que convierten una cadena parámetro de consulta en un mismo diccionario como ASP.NET Context.Request lo hace.

Estoy escribiendo una aplicación de consola y no un servicio web, por lo que no hay Contexto.Request para analizar la URL por mí.

Sé que es bastante fácil descifrar la cadena de consulta, pero prefiero usar una función FCL si existe.

+0

posible duplicado de [Obtener parámetros de URL de una cadena en .NET] (http://stackoverflow.com/questions/659887/get-url-parameters-from-a-string-in-net) –

Respuesta

76

Utilice esta:

string uri = ...; 
string queryString = new System.Uri(uri).Query; 
var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString); 

Este código por Tejs no es el camino 'adecuado' para obtener la cadena de consulta de la URI:

string.Join(string.Empty, uri.Split('?').Skip(1)); 
+11

Tenga en cuenta que 'Uri .Query' solo funcionará en Uri absoluto. En uno relativo arroja una 'InvalidOperationExeception'. – ghord

112

Se puede utilizar:

var queryString = url.Substring(url.IndexOf('?')).Split('#')[0] 
System.Web.HttpUtility.ParseQueryString(queryString) 

MSDN

+21

Pero deberá agregar una referencia a 'System.Web.dll'. – SLaks

+1

Como dice otra respuesta, ParseQueryString agregará 'http://example.com/file?a' como la primera clave. – Rune

+1

Actualizado con nuevo código. Por extraño que parezca, esta respuesta parece ser muy popular. – Tejs

-2

Se podría hacer referencia a System.Web en su aplicación de consola y luego buscar las funciones de utilidad que se dividen los parámetros de URL.

25

Esto debería funcionar:

string url = "http://example.com/file?a=1&b=2&c=string%20param"; 
string querystring = url.Substring(url.IndexOf('?')); 
System.Collections.Specialized.NameValueCollection parameters = 
    System.Web.HttpUtility.ParseQueryString(querystring); 

Según MSDN. No es exactamente el tipo de colección que está buscando, pero sí útil.

Editar: Al parecer, si se suministra la URL completa a ParseQueryString que se sumará 'http://example.com/file?a' como primera clave de la colección. Como probablemente eso no sea lo que quieres, agregué la subcadena para obtener solo la parte relevante de la url.

12

Eche un vistazo a HttpUtility.ParseQueryString() Le dará un NameValueCollection en lugar de un diccionario, pero aún debe hacer lo que necesita.

La otra opción es usar string.Split().

string url = @"http://example.com/file?a=1&b=2&c=string%20param"; 
    string[] parts = url.Split(new char[] {'?','&'}); 
    ///parts[0] now contains http://example.com/file 
    ///parts[1] = "a=1" 
    ///parts[2] = "b=2" 
    ///parts[3] = "c=string%20param" 
+1

1 para proporcionar la otra opción –

13

que tenía que hacer esto para una aplicación moderna de Windows.He utilizado el siguiente:

public static class UriExtensions 
{ 
    private static readonly Regex _regex = new Regex(@"[?|&]([\w\.]+)=([^?|^&]+)"); 

    public static IReadOnlyDictionary<string, string> ParseQueryString(this Uri uri) 
    { 
     var match = _regex.Match(uri.PathAndQuery); 
     var paramaters = new Dictionary<string, string>(); 
     while (match.Success) 
     { 
      paramaters.Add(match.Groups[1].Value, match.Groups[2].Value); 
      match = match.NextMatch(); 
     } 
     return paramaters; 
    } 
} 

EDIT: Esto se actualiza según la sugerencia de Maya

+1

La expresión regular no captura los parámetros con un "." en el medio como: user.name – MaYaN

+4

La expresión regular debería ser: "[? | &] ([\ w \.] +) = ([^? |^&] +)" – MaYaN

+0

¡Funcionó! ¡Gracias! –

4

En una sola línea de código:

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ")); 
5

Para proyectos aislados, donde las dependencias deben mantenerse al mínimo, me encontré usando esta aplicación mentación:

var arguments = uri.Query 
    .Substring(1) // Remove '?' 
    .Split('&') 
    .Select(q => q.Split('=')) 
    .ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault()); 

debida nota, sin embargo, que yo no manejo cadenas codificadas de ningún tipo, ya que yo estaba usando esto en un ambiente controlado, donde los problemas de codificación sería un error de código en el lado del servidor que debe ser fijo .

Cuestiones relacionadas