2013-04-08 47 views
5

Tôi hiện đang làm việc với Sơ đồ URI tùy chỉnh để xác thực người dùng bằng OAuth. Để thực hiện điều này, tôi cần lấy các giá trị của các tham số nhất định từ chuỗi truy vấn.Có cách nào đơn giản để nhận tham số chuỗi truy vấn từ URI trong Windows Phone không?

Có cách nào đơn giản để nhận thông tin này không? Hoặc là lựa chọn duy nhất của tôi để sử dụng REGEX hoặc thao tác chuỗi khác?

Trước đây tôi đã tìm thấy các tham chiếu đến những thứ như ParseQueryString, nhưng chúng được chứa trong các thư viện không có sẵn trên Windows Phone.

+2

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

Trả lời

8

Sau nhiều tìm kiếm tôi đã đổ bộ lên một cách tiếp cận đơn giản. Miễn là các chuỗi truy vấn được lưu giữ khá đơn giản (vì chúng nằm trong OAuth), phương thức này sẽ hoạt động.

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

Trong Windows trò chơi điện thoại XNA, truy cập vào các thông số khởi động như thế này từ trò chơi lớp ctor của bạn:

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

Trong Silverlight apps/XAML, bạn sẽ sử dụng e.InitParams từ Application_Startup (người gửi đối tượng, StartupEventArgs e) xử lý sự kiện. Một ví dụ về làm thế nào để làm điều đó là ở đây:

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

4

Từ https://stackoverflow.com/a/25164964/1033581:

  • xử lý một # trong Uri
  • xử lý giá trị thiếu khả năng như & name = trong Uri
  • không quên Uri.UnescapeDataString
  • trở về a.210 thay vì một IEnumerable vì vậy người ta có thể tìm thấy một tham số mong muốn một cách dễ dàng

Đối với Windows Phone 7 thiết bị (hoặc bạn chỉ có một chuỗi, không phải là một Uri, sau đó chỉ cần thay thế uri.OriginalString với chuỗi của bạn),

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

Lưu ý: trên thiết bị Windows Phone 7, Uri.Querykhông đáng tin cậy cho một Uri như "mailto: [email protected]? Subject = subject & body = body". Đó là lý do tại sao chúng tôi sử dụng Uri.OriginalString.

Đối với Windows Phone 8 điện thoại và bạn có một Uri, bạn có thể tối ưu hóa theo cách này,

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

Nếu bạn muốn biết nếu bạn đang ở trên một Windows Phone 8 thiết bị sử dụng một điện thoại Windows 7 ứng dụng:

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