我目前正在使用自定义URI方案来验证OAuth用户。为了做到这一点,我需要从查询字符串中获取某些参数的值。
有没有简单的方法来获取这些信息?或者我的唯一选择是使用REGEX或其他字符串操作?
我之前找到过类似ParseQueryString的参考资料,但这些都包含在Windows Phone上不可用的库中。
我目前正在使用自定义URI方案来验证OAuth用户。为了做到这一点,我需要从查询字符串中获取某些参数的值。
有没有简单的方法来获取这些信息?或者我的唯一选择是使用REGEX或其他字符串操作?
我之前找到过类似ParseQueryString的参考资料,但这些都包含在Windows Phone上不可用的库中。
经过大量搜索,我找到了一个简单的方法。只要查询字符串保持相对简单(如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;
}
来自https://dev59.com/zWTWa4cB1Zd3GeqPGLc9#25164964:
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>();
}
Uri.Query
是不可靠的。这就是为什么我们使用Uri.OriginalString
的原因。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);
foreach (var lp in this.LaunchParameters) {
Debug.WriteLine(" Key={0}, Value={1}", lp.Key, lp.Value);
}