使用HttpClient无法调用API控制器PUT接口的问题排查
HttpClient调用API接口返回400错误的问题与解决
我正在通过HttpClient实现API与Web应用之间的通信,但调用接口时返回400 Bad Request,无法正常触发控制器方法。
API控制器代码
[HttpPut, Route("voipport/{newPort}")] public async Task<IActionResult> PutVoipPort(int newPort) { try { await _repository.ChangePort(newPort); await _repository.AddNewRecord("PutVoipPort", "Success"); return Ok(); } catch(Exception exception) { return BadRequest(exception.Message); } }
原客户端调用代码
public async Task VOIPChangePort(int newPort) { var json = JsonConvert.SerializeObject(newPort); var data = new StringContent(json,Encoding.UTF8,"application/json"); var result = await _httpClient.PutAsync("voipport/{newPort}", data); result.EnsureSuccessStatusCode(); Console.WriteLine(result); }
请求返回的错误结果
{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers: { Date: Fri, 25 Nov 2022 18:15:08 GMT Server: Kestrel Transfer-Encoding: chunked Content-Type: application/problem+json; charset=utf-8 }}
问题原因分析
- 路由参数未正确替换:原客户端代码中使用了字符串字面量
"voipport/{newPort}",没有将变量newPort的实际值注入到URL中,导致请求的路径是无效的voipport/{newPort},无法匹配控制器的路由规则。 - 多余的请求体传递:控制器方法的
newPort参数是从路由中获取的,不需要传递JSON格式的请求体。传递请求体后,模型绑定过程无法正确解析参数,进而返回400错误。
解决方案代码
public async Task VOIPChangePort(int newPort) { var result = await _httpClient.PutAsync($"voipport/{newPort}", null); result.EnsureSuccessStatusCode(); }
内容的提问来源于stack exchange,提问作者Software Architect
相关产品推荐
相关产品推荐

