如何将对象传递给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方法的签名如下:

公共任务PostAsync(Uri requestUri,HttpContent内容)

因此,尽管您可以将传递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像您在此处那样调用属性可能会产生一些不良后果,例如死锁,因此您需要注意这一点。

以上是 如何将对象传递给HttpClient.PostAsync并序列化为JSON正文? 的全部内容, 来源链接: utcz.com/qa/419283.html

回到顶部