Is there an easy way to get query string parameters from a URI in Windows Phone?

I am currently working with a custom URI scheme to validate users using OAuth. To do this, I need to get the values โ€‹โ€‹of certain parameters from the query string.

Is there an easy way to get this information? Or my only option for using REGEX or other string manipulations?

Earlier I found links to things like ParseQueryString, but they are contained in libraries that are not available on Windows Phone.

+5
source share
3 answers

After a long search, I landed on a simple approach. While query strings are kept fairly simple (as they are in OAuth), this method should work.

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;

}
+8

fooobar.com/questions/1152297/...:

  • # Uri
  • & name= Uri
  • Uri.UnescapeDataString
  • Dictionary IEnumerable,

Windows Phone 7 ( , Uri, uri.OriginalString ),

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

: Windows Phone 7 Uri.Query Uri, "mailto: a@example.com? subject = subject & body = body". uri.OriginalString.

Windows Phone 8 Uri, ,

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

, Windows Phone 8 Windows Phone 7:

public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);
+4

Windows Phone XNA , , ctor:

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

In Silverlight / XAML applications, you should use e.InitParams from the Application_Startup event handler (object sender, StartupEventArgs e). An example of how to do this:

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

0
source

All Articles