使用 HttpClientPostAsJsonAsync 在 ASP.NET 核心中发送 HTTPPOST 消息

我想发送动态对象

new { x = 1, y = 2 };

作为 HTTP POST 消息的正文。因此,我尝试编写

var client = new HttpClient();

但我找不到方法

client.PostAsJsonAsync()

因此,我尝试将 Microsoft.AspNetCore.Http.Extended 包添加到 project.json 并添加

using Microsoft.AspNetCore.Http.Extensions;

使用条款。然而,它没有帮助我。

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

224838 次浏览

您应该添加对“ Microsoft.AspNet.WebApi.Client”包的引用(示例请参阅 这篇文章)。

不需要任何额外的扩展,您可以使用标准的 PostAsync方法:

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

在哪里 jsonInString值,你可以得到通过调用 JsonConvert.SerializeObject(<your object>);

我想补充的是,你也想把 Accept头文件添加到 httpClient:

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

我用这个类:

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 }));

你是对的,这已经在.NETCore 中实现很久了。

在撰写本文时(2019年9月) ,NuGet3的 project.json文件。X + 已经被 PackageReference所取代(如在 https://learn.microsoft.com/en-us/nuget/archive/project-json中所解释的)。

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

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

要访问 HttpClient类的 *Async方法,还需要在 .csproj文件中包含正确的 包裹引用,如下所示:

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

(见 https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference。 还有: 我们推荐以 ASP.NET Core 2.1为目标的应用程序,以后可以使用 Microsoft. AspNetCore.App 元包https://learn.microsoft.com/en-us/aspnet/core/fundamentals/metapackage)

诸如 PostAsJsonAsyncReadAsAsyncPutAsJsonAsyncDeleteAsync之类的方法现在应该可以开箱即用了(不需要使用指令)

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

微软现在推荐使用 IHttpClientFactory,它有以下好处:

  • 提供用于命名和配置逻辑的中心位置 例如,名为 github 的客户端可以是 注册并配置为访问 GitHub 注册为一般访问。
  • 通过委托处理程序编写传出中间件的概念 为基于 Polly 的中间件提供扩展 在 HttpClient中委托处理程序的优点。
  • 管理基础的池和生存期 HttpClientMessageHandler实例。避免自动管理 手动操作时常见的 DNS (域名系统)问题 管理 HttpClient生命周期。
  • 为所有请求添加可配置的日志记录体验(通过 ILogger) 通过工厂创建的客户端发送。

Https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1

设置:

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}


public IConfiguration Configuration { get; }


public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
// Remaining code deleted for brevity.

后例:

public class BasicUsageModel : PageModel
{
private readonly IHttpClientFactory _clientFactory;


public BasicUsageModel(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
    

public async Task CreateItemAsync(TodoItem todoItem)
{
var todoItemJson = new StringContent(
JsonSerializer.Serialize(todoItem, _jsonSerializerOptions),
Encoding.UTF8,
"application/json");
            

var httpClient = _clientFactory.CreateClient();
        

using var httpResponse =
await httpClient.PostAsync("/api/TodoItems", todoItemJson);
    

httpResponse.EnsureSuccessStatusCode();
}

Https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#make-post-put-and-delete-requests

如果您正在使用.NET 5或更高版本,您可以(也应该)使用 系统.Net. Http. Json中的 PostAsJsonAsync扩展方法:

httpClient.PostAsJsonAsync(url, new {
x = 1,
y = 2
});

如果你使用的是旧版本的.NET Core,你可以自己实现扩展函数:

public static class HttpClientExtensions
{
public static Task<HttpResponseMessage> PostJsonAsync(this HttpClient httpClient, string url, object body)
{
var bodyJson = JsonSerializer.Serialize(body);
var stringContent = new StringContent(bodyJson, Encoding.UTF8, "application/json");
return httpClient.PostAsync(url, stringContent);
}
}