2013-04-08 18 views
5

Obecnie pracuję z niestandardowym schematem URI, aby sprawdzić użytkowników korzystających z protokołu OAuth. Aby to zrobić, muszę pobrać wartości niektórych parametrów z ciągu zapytania.Czy istnieje prosty sposób na uzyskanie parametrów ciągu zapytania z identyfikatora URI w systemie Windows Phone?

Czy istnieje prosty sposób na uzyskanie tych informacji? Lub jest moją jedyną opcją korzystania z REGEX lub innych manipulacji ciągami?

Znalazłem wcześniej odniesienia do rzeczy takich jak ParseQueryString, ale te są zawarte w bibliotekach niedostępnych w Windows Phone.

+2

http://stackoverflow.com/questions/10936266/how-to-break-apart-a-uri-in-wp7 –

Odpowiedz

8

Po wielu poszukiwania wylądowałem na prostym podejściem. Dopóki ciągi zapytań są dość proste (tak jak w OAuth), ta metoda powinna działać.

public static Dictionary<string, string> ParseQueryString(string uri) { 

    string substring = uri.Substring(((uri.LastIndexOf('?') == -1) ? 0 : uri.LastIndexOf('?') + 1)); 

    string[] pairs = substring.Split('&'); 

    Dictionary<string,string> output = new Dictionary<string,string>(); 

    foreach(string piece in pairs){ 
     string[] pair = piece.Split('='); 
     output.Add(pair[0], pair[1]); 
    } 

    return output; 

} 
0

W grach Phone XNA Windows dostęp do parametrów startowych jak ten z klasy gier ctor:

foreach (var lp in this.LaunchParameters) { 
    Debug.WriteLine(" Key={0}, Value={1}", lp.Key, lp.Value); 
} 

w Silverlight/XAML aplikacji, należy użyć e.InitParams z Application_Startup (object sender, StartupEventArgs e) obsługa zdarzeń. Przykładem, jak to zrobić jest tutaj:

http://weblogs.asp.net/lduveau/archive/2009/08/15/provide-startup-parameters-to-silverlight-with-initparams.aspx

4

Od https://stackoverflow.com/a/25164964/1033581:

  • dotknięciem # w Uri
  • obsługi możliwą wartość brakującego jak & name = w Uri
  • nie zapominając Uri.UnescapeDataString
  • powrocie a Dictionary zamiast IEnumerable więc można znaleźć żądany parametr łatwo

do telefonu 7 urządzeń systemu Windows (lub masz tylko łańcuch, a nie Uri, a potem po prostu zastąpić uri.OriginalString z ciągiem),

static readonly char[] QueryStringSeparator1 = "#".ToCharArray(); 
static readonly char[] QueryStringSeparator2 = "?".ToCharArray(); 
static readonly char[] QueryStringSeparator3 = "&".ToCharArray(); 
static readonly char[] QueryStringSeparator4 = "=".ToCharArray(); 
public static Dictionary<string, string> QueryDictionary(this Uri uri) 
{ 
    return uri.OriginalString 
     .Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries) 
     .Select(a => a.Split(QueryStringSeparator2, StringSplitOptions.RemoveEmptyEntries) 
      .Select(b => b.Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries) 
       .Select(c => c.Split(QueryStringSeparator4)) 
       .Where(c => c[0].Length > 0) 
       .ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : "")) 
      .ElementAtOrDefault(1))// after ? 
     .FirstOrDefault()// before # 
     ?? new Dictionary<string, string>(); 
} 

Uwaga: na urządzeniu z systemem Windows Phone 7, Uri.Query jest niewiarygodne dla Uri, takie jak "mailto: [email protected]? Subject = subject & body = body". Dlatego używamy Uri.OriginalString.

dla telefonów urządzenia Windows 8 i masz uri, można zoptymalizować w ten sposób,

static readonly char[] QueryStringSeparator1 = "#".ToCharArray(); 
static readonly char[] QueryStringSeparator3 = "&".ToCharArray(); 
static readonly char[] QueryStringSeparator4 = "=".ToCharArray(); 
public static Dictionary<string, string> QueryDictionary(this Uri uri) 
{ 
    return uri.Query 
     .Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries) 
     .Select(a => a.Substring(1) 
      .Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries) 
      .Select(c => c.Split(QueryStringSeparator4)) 
      .Where(c => c[0].Length > 0) 
      .ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : "")) 
     .FirstOrDefault()// before # 
     ?? new Dictionary<string, string>(); 
} 

Jeśli chcesz wiedzieć, czy jesteś na urządzeniu z systemem Windows Phone 8 za pomocą telefonu Windows 7 aplikacji:

public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0); 
Powiązane problemy