我目前正在使用自定义URI方案来验证使用OAuth的用户。为了做到这一点,我需要从查询字符串中获取某些参数的值。有没有一种简单的方法从Windows Phone中的URI获取查询字符串参数?
有没有简单的方法来获取这些信息?或者是我使用REGEX或其他字符串操作的唯一选择?
我以前发现了像ParseQueryString这样的东西的引用,但这些包含在Windows Phone上不可用的库中。
我目前正在使用自定义URI方案来验证使用OAuth的用户。为了做到这一点,我需要从查询字符串中获取某些参数的值。有没有一种简单的方法从Windows Phone中的URI获取查询字符串参数?
有没有简单的方法来获取这些信息?或者是我使用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;
}
在Windows Phone的XNA游戏,访问启动参数像这样从你的游戏类构造函数:
foreach (var lp in this.LaunchParameters) {
Debug.WriteLine(" Key={0}, Value={1}", lp.Key, lp.Value);
}
在Silverlight/XAML应用程序,你可以使用e.InitParams从Application_Startup(对象发件人,StartupEventArgsē )事件处理程序。如何做到这一点的一个例子是在这里:
从https://stackoverflow.com/a/25164964/1033581:
Uri.UnescapeDataString
Dictionary
而不是IEnumerable
因此可以很容易找到所需的参数对于Windows Phone 7的设备(或者你只有一个字符串,而不是一个开放的,那么就用你的字符串替换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:[email protected]?subject = subject & body = body”。这就是我们使用Uri.OriginalString
的原因。
对于Windows Phone 8的设备,你有一个开放的,可以优化这种方式,
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);
http://stackoverflow.com/questions/10936266/how-to-break-apart-a-uri-in-wp7 – 2013-04-08 22:14:57