使用 HttpClient 的简单 POST

Posted

技术标签:

【中文标题】使用 HttpClient 的简单 POST【英文标题】:Simple POST with HttpClient 【发布时间】:2018-11-30 18:33:11 【问题描述】:

我有两个 ASP.NET Core 2.1 应用程序,我正在尝试使用 HttpClient 从一个应用程序到另一个应用程序进行简单的 POST 调用。

由于某种原因,当我使用 [FromBody] 来获取我正在尝试接收的简单文本时,我收到了 BadRequest 错误。

这是我的发件人代码。首先,这就是我的ConfigureServices 方法中的内容。我正在使用 ASP.NET Core 2.1 中的新 HttpClientFactory 功能。我还创建了一个名为 myApiCallerClient 的客户端类来处理我的 API 调用:

services.AddHttpClient("myNamedClient", client =>

    client.BaseAddress = new Uri("http://localhost:50625/api/");
    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Add("Accept", "application/json");
);

services.AddScoped(x => 
   var httpClientFactory = x.GetRequiredService<System.Net.Http.IHttpClientFactory>();
   var myApiCallerClient = httpClientFactory.CreateClient("myNamedClient");
   return new Clients.ApiCaller.ApiCallerClient(myApiCallerClient);
);

这是 myApiCallerClient 中的代码:

public async Task SayHello()

     var response = await _httpClient.PostAsync("test", new StringContent("Saying hello!", System.Text.Encoding.UTF8, "text/plain"));

这是我在接收端的代码,它是TestController 中的POST() API 方法:

[HttpPost]
public async Task Post([FromBody]string input)

    // Some logic

如果我使用[FromBody] 并且我在发件人上收到BadRequest 错误,我的呼叫不会命中此方法。如果我使用 [FromHeader],我的请求会命中此 API 方法,但我得到的是 null 值。

我在这里做错了什么?

【问题讨论】:

肯定显示BadRequest。你说你期待415。你看到什么不正确? 最终我不会发送短信。我主要担心的是我没有使用我的 API 方法。你认为我不会因为Content-Type 而击中它吗?一旦我确保一切正常,我将发送 JSON 数据,这些数据将在接收端进行反序列化。 是的,我愿意。您可以通过将HttpClient 请求更改为使用application/json 而不是text/plain 来轻松测试它,并且只需将周围的引号添加到您的虚拟字符串("\"Saying hello!\"")。 【参考方案1】:

ASP.NET Core 不支持开箱即用的 Content-Typetext/plain,因此服务器拒绝您的请求,因为在使用 [FromBody] 属性时它无法解析。

在 cmets 中,你说:

最终我不会发送文本。我主要担心的是我没有使用我的 API 方法。 [...] 确保一切正常后,我将发送 JSON 数据,这些数据将在接收端进行反序列化。

为了测试问题是否是由于text/plain Content-Type,您可以将您的PostAsync 行更新为如下内容:

var response = await _httpClient.PostAsync(
    "test",
    new StringContent("\"Saying hello!\"", System.Text.Encoding.UTF8, "application/json"));

由于application/json 默认情况下受支持的Content-Type,上面的代码使用它并用"s 包装您发送的值,以使其成为有效的JSON 值。

【讨论】:

以上是关于使用 HttpClient 的简单 POST的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient介绍和简单使用流程

HttpClient的简单运用

httpclient的简单使用

记录一个简单的HttpClient抓取页面内容

如何使用HttpClient

Angular 6 和 Spring boot - 无法使用简单的 HttpClient 调用获取数据