gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:43:51 25 4
gpt4 key购买 nike

我使用的是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比如死锁,所以你要小心这个。

关于c# - 如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36625881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com