ASP.NET Core Web应用POST方法始终接收NULL参数问题求助
解决ASP.NET Core POST方法参数为NULL的问题
这个问题我碰到过好几次,核心原因是你传的请求体格式和方法参数的绑定要求不匹配,咱们一步步来解决:
为什么会出现NULL?
当你给string类型参数加上[FromBody]特性时,ASP.NET Core的模型绑定器会期望请求体是纯JSON字符串(也就是被双引号包裹的单个字符串),而你现在传的{"msg": "hello"}是一个JSON对象,两者不匹配,所以绑定失败,参数自然就成了NULL。
解决方案一:修改请求体为纯JSON字符串
如果你就想用string类型接收参数,需要把请求体改成纯字符串格式:
- 使用curl的话,命令要改成这样:
注意curl -X POST -H "Content-Type: application/json" -d '"hello"' localhost:57084/api/values-d后面的内容是"hello",外层用单引号包裹,确保shell不会转义内部的双引号。 - 使用POSTMAN的话,选择
raw->JSON格式,直接在请求体输入:"hello"
解决方案二:创建实体类接收JSON对象(推荐)
如果你的业务需求就是要传递JSON对象,更规范的做法是定义一个对应的数据模型类:
public class MessageRequest { public string Msg { get; set; } }
然后修改你的POST方法:
[HttpPost] public void Post([FromBody]MessageRequest request) { System.Diagnostics.Debug.Print("\n'" + request.Msg + "'\n"); }
这样再发送{"msg": "hello"}的请求,request.Msg就能正确拿到hello的值了。
解决方案三:手动读取请求体内容(特殊场景)
如果坚持要用string参数且不想改请求格式,可以直接读取原始的请求体内容:
[HttpPost] public async Task Post() { using var streamReader = new StreamReader(Request.Body); string requestBody = await streamReader.ReadToEndAsync(); System.Diagnostics.Debug.Print("\n'" + requestBody + "'\n"); // 如果你需要解析JSON对象,可以用Newtonsoft.Json或者System.Text.Json来处理 // var msg = JsonSerializer.Deserialize<MessageRequest>(requestBody).Msg; }
额外排查点
- 确保请求头的
Content-Type严格设置为application/json,不要写成text/json或者其他格式,ASP.NET Core会根据这个头选择对应的绑定器。 - POSTMAN中不要选错请求体格式,比如
form-data或x-www-form-urlencoded是表单格式,和JSON不兼容,一定要选raw->JSON。
内容的提问来源于stack exchange,提问作者Dmitry Sazonov
相关产品推荐
相关产品推荐

