it-swarm.com.de

Erhalten Sie individuelle Abfrageparameter von Uri

Ich habe eine Uri-Zeichenfolge wie: http://example.com/file?a=1&b=2&c=string%20param

Gibt es eine vorhandene Funktion, die die Abfrageparameterzeichenfolge auf dieselbe Weise in ein Wörterbuch konvertiert wie ASP.NET Context.Request.

Ich schreibe eine Konsolen-App und keinen Webdienst, daher gibt es keinen Kontext. Bitte analysieren Sie die URL für mich.

Ich weiß, dass es ziemlich einfach ist, die Abfragezeichenfolge selbst zu knacken, aber ich würde lieber eine FCL-Funktion verwenden, falls vorhanden.

110
Ghostrider

Benutze das:

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

Dieser Code von Tejs ist nicht die 'richtige' Methode, um die Abfragezeichenfolge von der URI abzurufen:

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

Sie können verwenden:

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

MSDN

120
Tejs

Das sollte funktionieren:

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

Nach MSDN . Nicht der genaue Sammlungstyp, den Sie suchen, aber dennoch nützlich.

Bearbeiten: Wenn Sie ParseQueryString die vollständige URL angeben, wird anscheinend ' http://example.com) hinzugefügt/file? a 'als erster Schlüssel der Sammlung. Da dies wahrscheinlich nicht das ist, was Sie wollen, habe ich den Teilstring hinzugefügt, um nur den relevanten Teil der URL zu erhalten.

25
pyrocumulus

Ich musste dies für eine moderne Windows-App tun. Ich habe folgendes benutzt:

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

Schauen Sie sich HttpUtility.ParseQueryString () an. Es gibt Ihnen ein NameValueCollection anstelle eines Wörterbuchs, sollte aber dennoch tun, was Sie brauchen.

Die andere Option ist die Verwendung von 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

Für isolierte Projekte, bei denen die Abhängigkeiten auf ein Minimum beschränkt sein müssen, habe ich diese Implementierung verwendet:

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

Beachten Sie jedoch, dass ich keine codierten Zeichenfolgen verarbeiten kann, da ich diese in einer kontrollierten Umgebung verwendet habe, in der Codierungsprobleme einen Codierungsfehler auf der Serverseite darstellen, der behoben werden sollte.

8
Johny Skovdal

In einer einzigen Codezeile:

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

Microsoft Azure bietet ein Framework, mit dem dies einfach durchgeführt werden kann. http://Azure.github.io/Azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion :

0
Alex Bedro