当前位置: 首页 > 知识库问答 >
问题:

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

汝和裕
2023-03-14

我正在使用系统。网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。但是我怎样才能用微软做到这一点呢。网Http?谢谢

共有3个答案

江睿
2023-03-14

一个简单的解决方案是使用Microsoft ASP。NET Web API 2.2客户端,来自NuGet。

然后您可以简单地执行此操作,它会将对象序列化为JSON并将Content-Type标头设置为Application/json; charset=utf-8

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

var client = new HttpClient();
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var response = await client.PostAsJsonAsync("", data);
景麒
2023-03-14

您需要将数据作为原始字符串传递到请求正文中,而不是FormUrlEncodedContent。一种方法是将其序列化为JSON字符串:

var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json

现在只需将字符串传递给post方法。

var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json"); // use MediaTypeNames.Application.Json in Core 3.0+ and Standard 2.1+

var client = new HttpClient();
var response = await client.PostAsync(uri, stringContent);
宋宇
2023-03-14

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

公共任务PostAsync(Uri requestUri,HttpContent)

因此,虽然您可以将对象传递给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属性(如您在这里所做的)可能会产生一些不好的副作用,例如死锁,因此您需要小心处理。

 类似资料:
  • 问题内容: 我正在使用,在网上找到了几个示例。我设法创建此代码以发出请求: 一切正常。但是假设我想将第三个参数传递给该方法,则该参数称为。数据参数是这样的对象: 没有创建该怎么办?我的PHP 等待json输入,因此应该正确发送json。但是我该怎么做呢?谢谢。 问题答案: 您问题的直接答案是:否。方法的签名如下: 公共任务PostAsync(Uri requestUri,HttpContent内容

  • 问题内容: 我需要将一些对象序列化为JSON并发送到WebService。如何使用org.json库?否则我将不得不使用另一个?这是我需要序列化的类: 我只放了类的变量和构造函数,但也有getter和setter方法。所以如果有人可以帮忙 问题答案: 没有注释的简单方法是使用Gson库 就那么简单:

  • 有没有办法将一般对象序列化为Json并将Json反序列化为对象<如果对象是一个实体,我可以使用Jackson 2库来实现这个目的<但是如果对象是一个普通类,我该怎么做呢? 例如,我想序列化com.datastax.driver.core.querybuilder。将更新为Json并保存到DB,然后搜索并反序列化它以更新对象,最后将其用作com.datastax.driver.core.Sessio

  • 问题内容: 使用时 从其派生的类型的对象上抛出异常。如何规避呢? 问题答案: 由于找不到合适的解决方案,因此我编写了自己的解决方案,它不是一个JSON序列化器,而是一个Javascript序列化器

  • 问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。

  • 问题内容: 我有以下内容,但它不起作用,我在stackoverflow上的某个地方读到了它的工作原理,但我似乎无法使其工作..它出错了……我在做错什么吗? 如果我确实传递了这样的数据-它可以工作-所以我知道我的服务正在工作 问题答案: 我相信代码将在对象上调用.value或.toString(),然后通过网络传递。您想传递JSON。 因此,包括JSON JavaScript库 http://www