c# - 如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 主体?

我使用的是System.Net.Http,我在网上找到了几个例子。我设法创建了这个代码来发出 POST 请求:

public static string POST(string resource, string token)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(baseUri);
        client.DefaultRequestHeaders.Add("token", token);

        var content = new FormUrlEncodedContent(new[]
        {
             new KeyValuePair<string, string>("", "")
        });

        var result = client.PostAsync("", content).Result;
        string resultContent = result.Content.ReadAsStringAsync().Result;
        return resultContent;
    }
 }

一切正常。但是假设我想将第三个参数传递给 POST 方法,一个名为 data 的参数。数据参数是这样的对象:

object data = new
{
    name = "Foo",
    category = "article"
};

如何在不创建 KeyValuePair 的情况下做到这一点?我的 php RestAPI 等待 json 输入,因此 FormUrlEncodedContent 应该正确发送 raw json。但是如何使用 Microsoft.Net.Http 做到这一点?谢谢。

最佳答案

您的问题的直接答案是:不。PostAsync 的签名方法如下:

public Task PostAsync(Uri requestUri, HttpContent content)

因此,虽然您可以将 object 传递给 PostAsync,但它必须是 HttpContent 类型,并且您的匿名类型不符合该标准。

但是,有一些方法可以完成您想要完成的事情。首先,您需要将匿名类型序列化为 JSON,最常用的工具是 Json.NET .这方面的代码非常简单:

var myContent = JsonConvert.SerializeObject(data);

接下来,您需要构造一个内容对象来发送此数据,我将使用 ByteArrayContent 对象,但您可以根据需要使用或创建不同的类型。

var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);

接下来,您要设置内容类型以让 API 知道这是 JSON。

byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

然后您可以使用表单内容发送与您之前的示例非常相似的请求:

var result = client.PostAsync("", byteContent).Result

附带说明,像您在此处所做的那样调用 .Result 属性可能会有一些 bad side effects比如死锁,所以你要小心这个。

https://stackoverflow.com/questions/36625881/

相关文章:

java - gson 抛出 MalformedJsonException

javascript - Angular 5 服务读取本地 .json 文件

json - 如何不使用 Go 将空结构编码为 JSON?

python - 将 Python namedtuple 序列化为 json

c# - 使用 ConfigurationBuilder 设置基本路径

javascript - 需要 Handlebars.js 来渲染对象数据而不是 "[Object

javascript - AJAX跨域调用

json - Groovy - 将对象转换为 JSON 字符串

c# - 使用 JSON.net 获取 JToken 的名称/ key

json - 有 JSON 的流 API 吗?