使用 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-Type
或 text/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的主要内容,如果未能解决你的问题,请参考以下文章