字典和对象对Web服务内容类型字符串的对象



我有字典,有值如何将它们转换为格式 application/jsonapplication/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>();
    }
}

这样,您可以直接序列化词典。再次,对于对象,您需要按照上述手动转换它们。

相关内容

  • 没有找到相关文章

最新更新