如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 正文?

2023-12-01

我在用着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?我的PHPRestAPI等待 json 输入,所以FormUrlEncodedContent应该发送rawjson 正确。但我怎样才能做到这一点Microsoft.Net.Http?谢谢。


Update:如果您使用的是 .NET 5 或更高版本,请使用这个解决方案.

对你的问题的直接回答是:不。签名PostAsync方法如下:

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

所以,虽然你可以通过object to 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像你在这里做的财产可以有一些不良副作用比如死锁,所以你要小心这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 正文? 的相关文章

随机推荐