所以我試圖把一些非常簡單而優雅的代碼樣本,共同幫助人們使用我的API。我正在處理的最新語言是C#。C#應用程序/ X WWW的形式,進行了urlencoded的OAuth和HTTP REST請求HttpClient的
我認爲IETF OAuth2.0的標準I讀意味着在HTTP請求的內容類型必須是「應用程序/ x WWW的形式進行了urlencoded」。我擁有的Django API服務器目前似乎只支持這種Content-Type(用於OAuth資源)。其他語言POST內容默認爲這種方式!
經過廣泛的研究和幾個實驗後,我想知道如果我錯過了一些基本的東西。當然會有一個有用的庫OR技術來創建... urlencoded字符串或至少有其他人必須碰到這個?
我會概述一下迄今爲止我所見過的最好的解決方案,但它似乎是錯誤的。
也從一堆的互聯網瀏覽我想我會使用HttpClient庫。我喜歡它使用異步模型的事實,對於使用WPF或XAML或Windows 8應用程序的任何開發人員來說,這可能會更有用。它也適用於控制檯和表單。
我使用Newtonsoft Json.Net庫進行序列化。首先我創建一個授權字符串的POCO。然後我將它序列化到JSON,然後到鍵/值對,然後遍歷所需的'='和'&'字符串連接的鍵/值對,然後UTF-8,然後轉義空格等。
//Setup HTTP request
HttpClient httpRequest = new HttpClient();
httpRequest.DefaultRequestHeaders.Add("Accept", "application/json");
string urlBase = "https://__secret__/api/v1/";
HttpResponseMessage msg = new HttpResponseMessage();
//POST to oauth to get token (must be sent as "application/x-www-form-urlencoded")
OAuthConfig oAuthCredentials = new OAuthConfig { client_id = client_id, client_secret = secret, username = "__secret__", password = "__secret__", grant_type = "__secret__" };
string jsonString = JsonConvert.SerializeObject(oAuthCredentials); //convert to JSON
Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString); //convert to key/value pairs
string urlEncodedData = ConvertToFormUrlEncodedFormat(values);
HttpContent payload = new StringContent(urlEncodedData, Encoding.UTF8, "application/x-www-form-urlencoded");
msg = httpRequest.PostAsync(urlBase + "oauth/access_token/", payload).Result;
string responseBodyAsText = msg.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseBodyAsText);
我能想到的是其他選項...
的反思,但是挖掘到了一個代碼示例中的反射似乎有點狂躁。
事實證明,除了OAuth設置,API的其餘部分支持JSON類型的POST。所以我想我可以編寫一個函數來遍歷oAuthConfig模型並鏈接一個字符串,因爲POCO模型不太可能改變,並且是唯一需要urlEncoding的模型,我可以預見。這將使我們免於使用詞典的混亂。字典的使用,然後迭代更通用,但也許有點OTT。
我想大多數時候人們會使用JSON,因此顯示這種情況可能發生的情況是有用的。
總體看來挺難的序列化POCO模型爲一個字符串和/或一個url編碼字符串。
問題
- 沒有OAuth的任務url編碼,你能不能轉換服務器端?
- 是HttpClient的最佳選擇,是否異步?
- 有沒有更簡單的方法來序列化一個POCO ... form-urlencoded?
感謝您的任何有用的意見。