ASP.NET Core POST请求返回204无内容及参数接收为null问题求助
解决ASP.NET Core API POST请求返回null及204 No Content的问题
兄弟,我来帮你捋清楚问题根源,再给你几个靠谱的解决方案:
问题出在哪?
你用[FromBody]string json接收请求体,但ASP.NET Core的模型绑定有个规则:当你指定接收string类型时,它期望请求体是被双引号包裹的原始JSON字符串,而不是结构化的JSON对象。你现在传的是一个嵌套的JSON对象,模型绑定没法把它直接转成string,所以json参数就变成了null。当API返回null时,ASP.NET Core会自动返回HTTP 204 No Content状态码,这就是你遇到的现象。
解决方案
根据你的需求,分两种场景给出方案:
场景1:确实要把整个JSON作为字符串返回
有两种实现方式:
方式一:调整Postman的请求体格式
把你原来的JSON对象用双引号包裹,同时转义内部的所有双引号,示例如下:"{ \"car\": { \"licenseplate\": \"XX-XXX-X\", \"make\": \"Audi\", \"model\": \"A7\", \"year\": 2017, \"fueltype\": 1, \"available\": true } }"这样ASP.NET Core就能识别这是一个字符串,正确绑定到
json参数上。方式二:直接读取原始请求流
放弃[FromBody]绑定,直接从请求流里读取原始内容,代码改成这样:[HttpPost] public async Task<string> Post() { using var streamReader = new StreamReader(Request.Body); return await streamReader.ReadToEndAsync(); }这种方式不管你传的是JSON对象还是字符串,都会原封不动返回,灵活性更高。
场景2:推荐做法——用实体类接收结构化JSON
这才是ASP.NET Core API的标准用法,更易维护和扩展:
- 先定义和你的JSON结构匹配的实体类:
public class CarRequest { public CarDetails Car { get; set; } } public class CarDetails { public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } public int Year { get; set; } public int FuelType { get; set; } public bool Available { get; set; } } - 修改API方法:
[HttpPost] public CarRequest Post([FromBody]CarRequest request) { // 这里可以直接操作request.Car的各个属性,做业务逻辑 return request; } - 最后确认Postman的请求头里
Content-Type设置为application/json(这个是模型绑定的必要前提),请求体保持你原来的JSON内容即可。
这样修改后,API会正确接收并返回结构化的JSON,完全符合REST API的设计规范。
内容的提问来源于stack exchange,提问作者Ramon Brokking
相关产品推荐
相关产品推荐

