web-dev-qa-db-fra.com

Obtenir des paramètres de requête individuels auprès d'Uri

J'ai une chaîne d'URI du type: http://example.com/file?a=1&b=2&c=string%20param

Existe-t-il une fonction existante qui convertirait la chaîne de paramètre de requête en dictionnaire de la même manière que le fait ASP.NET Context.Request.

J'écris une application console et non un service Web, il n'y a donc pas de Context.Request pour analyser l'URL pour moi.

Je sais qu'il est assez facile de déchiffrer la chaîne de requête moi-même mais je préférerais utiliser une fonction FCL si elle existe.

110
Ghostrider

Utilisez ceci:

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

Ce code de Tejs n'est pas le "bon" moyen d'obtenir la chaîne de requête à partir de l'URI:

string.Join(string.Empty, uri.Split('?').Skip(1));
118
Timothy Shields

Vous pouvez utiliser:

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

MSDN

120
Tejs

Cela devrait fonctionner:

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

Selon MSDN . Pas exactement le type de collection que vous recherchez, mais néanmoins utile.

Edit: Apparemment, si vous fournissez l'URL complète à ParseQueryString, elle ajoutera ' http://example.com/file? a 'en tant que première clé de la collection. Puisque ce n'est probablement pas ce que vous voulez, j'ai ajouté la sous-chaîne pour obtenir uniquement la partie pertinente de l'URL.

25
pyrocumulus

Je devais le faire pour une application Windows moderne. J'ai utilisé ce qui suit:

public static class UriExtensions
{
    private static readonly Regex _regex = new Regex(@"[?&](\w[\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;
    }
}
14
Ross Dargan

Jetez un coup d'œil à HttpUtility.ParseQueryString () Cela vous donnera un NameValueCollection au lieu d'un dictionnaire, mais devrait quand même faire ce dont vous avez besoin.

L'autre option consiste à utiliser 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"
12
3Dave

Pour les projets isolés, où les dépendances doivent être réduites au minimum, je me suis retrouvé à utiliser cette implémentation:

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

Notez bien que je ne gère aucune chaîne encodée, car je l’utilisais dans un environnement contrôlé, où les problèmes d’encodage seraient une erreur de codage côté serveur qui devrait être corrigée.

8
Johny Skovdal

Dans une seule ligne de code:

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
6
Pabinator
0
Alex Bedro