调用带[FromBody]参数的Web API Post方法返回BadRequest,求助
问题原因
你的第二个API方法Getdata2接收的是单个字符串类型的请求体([FromBody] string name),但客户端代码序列化的是包含name属性的匿名对象,最终发送的JSON是{"name":"Test"},这和API期望的纯字符串(比如"Test")格式不匹配,导致ASP.NET Core模型绑定失败,返回BadRequest。
解决办法
你有两种可选修复方案:
方案1:修改客户端,发送纯字符串JSON
调整客户端请求体的构造逻辑,直接序列化单个字符串而非对象:
String url = "https://localhost:1234/api/getdata2"; var name = "Test"; var json = JsonSerializer.Serialize(name); // 序列化后结果为 "\"Test\"" var parameter = new StringContent(json, Encoding.UTF8, "application/json"); var client = new HttpClient(); var response = client.PostAsync(url, parameter).Result; if (response.IsSuccessStatusCode) { Console.Write(response.Content.ReadAsStringAsync().Result); } else { Console.Write(response.StatusCode); }
方案2:修改API,用类封装参数
如果希望保留客户端现有请求格式,可以给API定义参数类,实现对象级别的绑定:
public class NameRequest { public string Name { get; set; } } [HttpPost] [Route("getdata2")] public IActionResult Getdata2([FromBody] NameRequest request) { return Ok("Hello" + request.Name); }
若客户端JSON的键名(name)和类属性名(Name)大小写不匹配,可通过[JsonPropertyName("name")]注解调整映射关系。
额外提示
- API路由定义中
Route(getdata1)应改为字符串字面量Route("getdata1"),否则会出现编译错误,请检查代码。 - 尽量避免用
.Result同步调用异步方法,推荐使用await避免死锁风险:
var response = await client.PostAsync(url, parameter); var content = await response.Content.ReadAsStringAsync();
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

