我有字典,有值如何将它们转换为格式 application/json
和 application/x-www-form-urlencoded
最简单的标准方法:
var values = new Dictionary<string, string>
{
{"id", "1"},
{"amount", "5"}
};
关于具有相同字段的类对象的相同问题:
class values
{
public String id { get; set; }
public string amount { get; set; }
}
简单的方法是使用json.net库来发布数据。您可以这样将对象转换为application/json
:
var jsonString = JsonConvert.SerializeObject(values);
然后将其发布到您的服务中:
private static T Call<T>(string url, string body)
{
var contentBytes = Encoding.UTF8.GetBytes(body);
var request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 60 * 1000;
request.ContentLength = contentBytes.Length;
request.Method = "POST";
request.ContentType = @"application/json";
using (var requestWritter = request.GetRequestStream())
requestWritter.Write(contentBytes, 0, (int)request.ContentLength);
var responseString = string.Empty;
var webResponse = (HttpWebResponse)request.GetResponse();
var responseStream = webResponse.GetResponseStream();
using (var reader = new StreamReader(responseStream))
responseString = reader.ReadToEnd();
return JsonConvert.DeserializeObject<T>(responseString);
}
是否要从问题中清楚地清楚您是否要手动序列化字典或对象,然后使用自定义方式发送或是否要自动序列化并将其发送到Web服务。
手动方式:
JSON
PM > Install-Package Newtonsoft.Json
json.net本身支持JSON对象的字典,当然也反对JSON对象序列化。您只需安装它并使用以下方式序列化:
var jsonString = JsonConvert.SerializeObject(values); // values can be Dictionary<string, Anything> OR an object
结果:
{
"id": "1",
"amount", "5"
}
形式URL编码
最干净的方法是使用.NET内置实用程序HttpUtility.ParseQueryString
(还编码任何非ASCII字符(:
var nvc = HttpUtility.ParseQueryString("");
foreach(var item in values)
nvc.Add(item.Key, item.Value);
var urlEncodedString = nvc.ToString();
结果:
id=1&amount=5
请注意,没有直接的方法将对象序列化到形式的URL编码字符串中,而无需手动添加其成员,例如:
nvc.Add(nameof(values.id), values.id);
nvc.Add(nameof(values.amount), values.amount);
自动方式:
如果您只使用HttpClient
:
PM > Install-Package Microsoft.AspNet.WebApi.Client
JSON
您可能还需要使用HttpClientExtensions
扩展方法进行自动JSON序列化(没有它,您需要手动将其序列化如上所述(:
using (var client = new HttpClient())
{
// set any header here
var response = await client.PostAsJsonAsync("http://myurl", values); // values can be a dictionary or an object
var result = await response.Content.ReadAsAsync<MyResultClass>();
}
形式URL编码
using (var client = new HttpClient())
{
using (var content = new FormUrlEncodedContent(values)) // this must be a dictionary or a IEnumerable<KeyValuePair<string, string>>
{
content.Headers.Clear();
content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
var response = await client.PostAsync(url, content);
var result = await response.Content.ReadAsAsync<MyResultClass>();
}
}
这样,您可以直接序列化词典。再次,对于对象,您需要按照上述手动转换它们。