使用HttpClient进行简单的POST请求

8
我有两个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”。你看到了什么不正确的地方? - Sam
1
最终我不会发送文本。我在这里的主要关注点是我没有调用我的API方法。你认为我没有调用它是因为Content-Type吗?一旦我确保一切正常,我将发送JSON数据,该数据将在接收端进行反序列化。 - Sam
1
是的,我可以。您可以通过将HttpClient请求更改为使用application/json而不是text/plain,并简单地在您的虚拟字符串周围添加引号("\"Saying hello!\"")来轻松测试它。 - Kirk Larkin
1个回答

7
ASP.NET Core默认不支持text/plainContent-Type,因此当使用[FromBody]属性时,服务器会拒绝请求,因为它无法解析该类型的请求。在评论中,您提到:

最终我不会发送文本。我主要关心的是我没有调用我的API方法。[...]一旦我确保一切正常,我将发送JSON数据,接收方将对其进行反序列化。

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

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

作为默认支持的Content-Type,application/json会被使用,上述代码将您发送的值用"包裹起来,使其成为有效的JSON值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接