使用HttpClient PostAsJsonAsync在ASP.NET Core中发送HTTP POST消息


143

我想发送像

new { x = 1, y = 2 };

作为HTTP POST消息的主体。所以我尝试写

var client = new HttpClient();

但我找不到方法

client.PostAsJsonAsync()

所以我试图将Microsoft.AspNetCore.Http.Extensions包添加到project.json并添加

using Microsoft.AspNetCore.Http.Extensions; 

使用条款。但是,它没有帮助我。

那么,在ASP.NET Core中使用JSON正文发送POST请求的最简单方法是什么?


Answers:


206

您应该添加对“ Microsoft.AspNet.WebApi.Client”包的引用(有关示例,请阅读本文)。

如果没有任何其他扩展,则可以使用标准PostAsync方法:

client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));

其中jsonInString值可以通过调用得到JsonConvert.SerializeObject(<your object>);


1
但是Microsoft.AspNet.WebApi.Client看起来不像ASP.NET Core RC2库。secon方式实际上是太多的代码重复((
Rem

@Rem为什么不创建HttpClient 扩展方法(PostAsJsonAsync)以使用第二种方法。它使您可以避免代码重复。
adem caglin

1
当然。但是我问了一个问题以便发现我缺少什么。我不敢相信它还没有在Core中实现!
Rem

1
这个库是不是核心/ .NET的标准之一,我不认为System.Net.Http.Formatting是否已经被port做
克里斯小号

1
这将适用于通过nuget包Microsoft.Extensions.Http在.NET Core 2.2中由IHttpClientFactory创建的HttpClient。但是,您如何以这种方式进行操作,但是要添加标题,例如授权密钥。
尼克·加里莫尔

98

我用这个课:

public class JsonContent : StringContent
{
    public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
    { }
}

用法样本:

new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));

5
为什么不使用扩展方法?公共静态类JsonContent {public Task <?> PostAsJSonAsync(此HttpClient客户端,对象为SerializeAsJson){...}}
TamusJRoyce

2
我喜欢JsonContent类的方法
Marco Alves,

这会设置Content-Length:HTTP标头吗?
Vyacheslav Napadovsky

1
@VyacheslavNapadovsky它取决于HttpClient设置,例如,是否client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Length将设置一个设置标题,而是Transfer-Encoding: chunked将其设置。但是,如果创建像这样的客户端var client = new HttpClient();,则Content-Length默认情况下将为此内容类设置标头。
stop-cran

12

我将添加到已接受的答案中,您也想将Accept标头添加到httpClient

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

是的,对我来说这也是必需的,已通过邮递员确认。
Guo

1

没错,这早已在.NET Core中实现。

在撰写本文时(2019年9月),project.jsonNuGet 3.x + 的文件已被PackageReference(如https://docs.microsoft.com/zh-cn/nuget/archive/project-json中所述)取代)。

要访问该类的*Async方法,必须正确配置文件。HttpClient.csproj

.csproj在纯文本编辑器中打开文件,并确保第一行是
<Project Sdk="Microsoft.NET.Sdk.Web">
(如https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the -csproj-format)。

要访问该类的*Async方法HttpClient,您还需要具有正确的包参考.csproj文件中,如下所示:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <!-- ... -->
</ItemGroup>

(请参阅https://docs.microsoft.com/zh-cn/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference。另请参见:我们建议针对ASP.NET Core 2.1和以后使用Microsoft.AspNetCore.App元数据包https: //docs.microsoft.com/zh-cn/aspnet/core/fundamentals/metapackage

法如PostAsJsonAsyncReadAsAsyncPutAsJsonAsyncDeleteAsync现在应该工作开箱。(无需使用指令。)

更新: .NET Core 3.0中不再需要PackageReference标记。


我无法使PostAsJsonAsync与.NET Core 3.1一起使用。谢谢
克里斯·科伦科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.