You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用带[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:22:05