post json 到 mvc .net 核心

post json to mvc .net core

我启动了一个 asp.netcore mvc 项目,其中一个控制器接受 post 并将 json 对象作为参数

然后我使用 Insomnia rest 客户端通过 posting json 对象来测试这个动作

但是我收到错误请求错误

当我通过网页执行 post 时,它工作正常

我在其他客户端的测试有什么问题

* 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

这里确实不够准确回答你的问题,但是你说的一件事让我猜到一个潜在的问题:

when I do the post via webpage, it works fine

通过网页提交的表单通常会被编码为 x-www-form-urlencodedmultipart/form-data。 ASP.NET Core 将乐于接受任何一种编码,无需额外配置。但是,要接受 JSON,您绑定到操作方法的参数需要用 [FromBody]:

修饰
public IActionResult Foo([FromBody]Bar bar)

不过,一旦您这样做,该操作将不再接受除 JSON/XML/etc 之外的任何内容。如果您尝试 post 为 x-www-form-urlencodedmultipart/form-data,它将失败。

所以有两件事:

  1. 如果您需要接受类似 JSON 的内容,请将 FromBody 属性添加到您的操作参数中。

  2. 如果你需要接受两者类似JSON的常规形式post, 你需要两个动作方法。是的,你没看错:两个。一个有 FromBody,一个没有。在内部,您可以将操作方法​​的实际代码分解为控制器上的私有或受保护方法,然后让两个操作都使用它,这样至少您不必重复代码。