2010-05-21 30 views
89

Ho una stringa uri come: http://example.com/file?a=1&b=2&c=string%20paramOttenere i parametri di ricerca individuali da Uri

C'è una funzione esistente che avrebbe convertire stringa di parametri di query in un stesso modo dizionario come ASP.NET Context.Request lo fa.

Sto scrivendo un'app console e non un servizio Web, quindi non esiste Context.Request per analizzare l'URL per me.

So che è piuttosto semplice suddividere la stringa di query da solo, ma preferirei utilizzare una funzione FCL se esiste.

+0

possibile duplicato del [Get parametri URL da una stringa in .NET] (http://stackoverflow.com/questions/659887/get-url-parameters-from-a-string-in-net) –

risposta

76

Utilizzare questa:

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

Questo codice da Tejs non è il modo 'corretto' per ottenere la stringa di query dalla URI:

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

Nota che 'Uri .Query' funzionerà solo su Uri assoluto. Su quello relativo lancia un 'InvalidOperationExeception'. – ghord

112

È possibile utilizzare:

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

MSDN

+21

Ma dovrai aggiungere un riferimento a 'System.Web.dll'. – SLaks

+1

Come un'altra risposta dice, ParseQueryString aggiungerà "http://example.com/file?a" come prima chiave. – Rune

+1

aggiornato con nuovo codice. Stranamente, questa risposta sembra essere molto popolare. – Tejs

-2

Si potrebbe fare riferimento System.Web nella vostra applicazione console e quindi cercare le funzioni di utilità che spaccano i parametri URL.

25

Questo dovrebbe funzionare:

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

Secondo MSDN. Non è esattamente il tipo di raccolta che stai cercando, ma comunque utile.

Edit: A quanto pare, se si fornisce l'URL completo ParseQueryString si aggiungerà 'http://example.com/file?a' come prima chiave della collezione. Poiché probabilmente non è ciò che desideri, ho aggiunto la sottostringa per ottenere solo la parte rilevante dell'URL.

12

Dai un'occhiata a HttpUtility.ParseQueryString() Ti darà un NameValueCollection invece di un dizionario, ma dovrebbe comunque fare ciò che ti serve.

L'altra opzione è utilizzare 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 per fornire l'altra opzione –

13

ho dovuto fare questo per una moderna app per Windows.Ho usato il seguente:

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: Questa è aggiornato secondo suggerimento di Maya

+1

La regex non cattura i parametri con un "." nel mezzo come: user.name – MaYaN

+4

Il regex dovrebbe essere: "[? | &] ([\ w \.] +) = ([^? |^&] +)" – MaYaN

+0

Ha funzionato! Grazie! –

4

In una sola riga di codice:

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

per i progetti isolati, dove le dipendenze devono essere ridotti al minimo, mi sono trovato di utilizzare questo Imple mentazione:

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

causa nota, però, che non mi occupo stringhe codificate di ogni tipo, come stavo usando questo in un ambiente controllato, dove i problemi di codifica sarebbe un errore di codifica sul lato server che deve essere risolto .

Problemi correlati