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.
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));
Vous pouvez utiliser:
var queryString = url.Substring(url.IndexOf('?')).Split('#')[0]
System.Web.HttpUtility.ParseQueryString(queryString)
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.
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;
}
}
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"
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.
Dans une seule ligne de code:
string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
Microsoft Azure offre un cadre facilitant cette opération. http://Azure.github.io/Azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion :