所以我试图整理一些非常简单和优雅的代码示例来帮助人们使用我的 API。我正在处理的最新语言是 C#。
我认为我阅读的 IETF OAuth2.0 标准意味着 HTTP 请求 Content-Type 必须是“application/x-www-form-urlencoded”。我拥有的 Django API 服务器目前似乎只支持这种 Content-Type(用于 OAuth 资源)。其他语言默认以这种方式发布内容!
经过广泛的研究和几次实验,我想知道我是否错过了一些基本的东西。当然会有一个有用的库或技术来创建 ...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 模型序列化为字符串和/或 urlEncoded 字符串似乎非常困难。
问题
- OAuth 要求 urlencoded,你能转换服务器端吗?
- HttpClient 是最佳选择,异步重要吗?
- 有没有更好更简单的方法将 POCO 序列化为 ...form-urlencoded?
感谢您提出的任何有用的意见。