ASP.NET Core MVC接收JSON的Post接口,Insomnia测试报400但网页提交正常
问题描述
我搭建了一个ASP.NET Core MVC项目,控制器中包含一个接收JSON对象作为参数的Post接口。使用Insomnia客户端向该接口提交JSON数据时,返回400 Bad Request错误,但通过网页提交相同内容却能正常运行。请求日志如下:
* Preparing request to http://localhost:51840/Books/Create * Using libcurl/7.51.0-DEV OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.6.1_DEV * Enable automatic URL encoding * Enable SSL validation * Enable cookie sending with jar of 0 cookies * Found bundle for host localhost: 0x1df804a67a0 [can pipeline] * Re-using existing connection! (#6) with host localhost * Connected to localhost (::1) port 51840 (#6) > POST /Books/Create HTTP/1.1 > Host: localhost:51840 > User-Agent: insomnia/5.14.9 > Content-Type: application/json > Accept: */* > Content-Length: 32 | { | "Id" : 5, | "Name": "Book 3" | } * upload completely sent off: 32 out of 32 bytes < HTTP/1.1 400 Bad Request < Server: Kestrel < X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcbWljcm9cRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxN1xQcm9qZWN0c1xRdWlya3lCb29rTGlzdFxCb29rTGlzdFxCb29rTGlzdFxCb29rc1xDcmVhdGU=?= < X-Powered-By: ASP.NET < Date: Fri, 16 Mar 2018 08:03:48 GMT < Content-Length: 0 * Curl_http_done: called premature == 0 * Connection #6 to host localhost left intact
解决方案
这个问题我之前也碰到过,核心原因是ASP.NET Core MVC默认的参数绑定规则和你发送的JSON格式不匹配:
1. 为什么网页提交正常?
网页表单提交的请求格式是application/x-www-form-urlencoded或者multipart/form-data,ASP.NET Core MVC的控制器方法默认会使用[FromForm]特性来绑定这类请求的参数,所以网页提交能正常解析。
2. 为什么Insomnia发JSON会报400?
你用Insomnia发送的是application/json格式的数据,但你的控制器参数没有明确指定用[FromBody]来绑定JSON内容,框架无法正确解析请求体里的JSON,直接返回400错误。
3. 修复步骤
只需要给控制器方法的参数加上[FromBody]特性即可:
假设你的控制器代码原本是这样的:
[HttpPost] public IActionResult Create(Book book) { // 业务逻辑 return View(); }
修改成:
[HttpPost] public IActionResult Create([FromBody] Book book) { // 业务逻辑 return Ok(); // 如果是API接口,返回Ok更合适;如果是页面,可以继续返回View }
这里的Book实体类要和你发送的JSON结构对应:
public class Book { public int Id { get; set; } public string Name { get; set; } }
4. 额外验证点
- 确保Insomnia的
Content-Type请求头确实是application/json(从你的日志看已经设置正确了) - 检查JSON格式是否有语法错误(你的示例JSON是正确的)
- 如果还是报错,可以检查实体类的属性是否有必填验证(比如
[Required]),而你的JSON里有没有遗漏对应字段
修改完之后重启项目,再用Insomnia发送请求,应该就能正常返回200了。
内容的提问来源于stack exchange,提问作者developer7788
相关产品推荐
相关产品推荐

