在Windows Phone中获取URI的查询字符串参数是否有简单的方法?

5

我目前正在使用自定义URI方案来验证OAuth用户。为了做到这一点,我需要从查询字符串中获取某些参数的值。

有没有简单的方法来获取这些信息?或者我的唯一选择是使用REGEX或其他字符串操作?

我之前找到过类似ParseQueryString的参考资料,但这些都包含在Windows Phone上不可用的库中。


2
https://dev59.com/zWTWa4cB1Zd3GeqPGLc9 - Derek Beattie
3个回答

9

经过大量搜索,我找到了一个简单的方法。只要查询字符串保持相对简单(如OAuth中所示),这种方法应该有效。

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;

}

4

来自https://dev59.com/zWTWa4cB1Zd3GeqPGLc9#25164964:

  • 处理Uri中的#
  • 处理可能缺少值,如Uri中的&name=
  • 不要忘记使用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设备上,像“mailto:a@example.com?subject=subject&body=body”这样的Uri中,Uri.Query不可靠的。这就是为什么我们使用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 7应用的Windows Phone 8设备上:

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接