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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:16:27