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

时间:2016-06-10 14:12:12

标签: c# asp.net-core .net-core

我想发送像

这样的动态对象
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请求的最简单方法是什么?

6 个答案:

答案 0 :(得分:139)

您应该添加对" Microsoft.AspNet.WebApi.Client"的引用。包(读取this article样本)。

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

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

您可以通过调用jsonInString

获得JsonConvert.SerializeObject(<your object>);

答案 1 :(得分:64)

我使用这个类:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a onclick="scrollToAnchor('1')">nav 1</a>
<a onclick="scrollToAnchor('2')">nav 2</a>
<a onclick="scrollToAnchor('3')">nav 3</a>
<div class="content" id="1">1</div>
<div class="content" id="2">2</div>
<div class="content" id="3">3</div>

使用样本:

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

答案 2 :(得分:9)

我会在接受的答案中添加您希望将Accept标题添加到httpClient

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

答案 3 :(得分:3)

Microsoft现在建议使用具有以下优点的IHttpClientFactory

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

enter image description here

设置:

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.

POST示例:

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://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1

答案 4 :(得分:1)

您可以使用IEnterprise.Easy-HTTP,因为它内置了类解析:

await new RequestBuilder<ExampleObject>()
.SetHost("https://httpbin.org")
.SetContentType(ContentType.Application_Json)
.SetType(RequestType.Post)
.SetModelToSerialize(dto)
.Build()
.Execute();

答案 5 :(得分:1)

您是对的,因为它早已在.NET Core中实现。

在撰写本文时(2019年9月),NuGet 3.x +的project.json文件已由PackageReference取代(如https://docs.microsoft.com/en-us/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文件中具有正确的 package引用,如下所示:

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

(请参阅https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference。 另外:我们建议针对ASP.NET Core 2.1的应用程序,以后使用Microsoft.AspNetCore.App元包https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage

诸如PostAsJsonAsyncReadAsAsyncPutAsJsonAsyncDeleteAsync之类的方法现在应该可以立即使用。 (无需使用指令。)

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