我只是没有运气将 url 编码的表单值从邮递员发送到使用 file->new 项目创建的普通 asp.net core 2.1 Web api。我没有做任何事情,但新的模型验证功能似乎仍然启动并向邮递员返回 400 Bad Request。谁能告诉我我做错了什么?
控制器动作:
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
原始请求(如 fiddler 中所示):
POST http://localhost:60843/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: a791eee7-63ff-4106-926f-2s67a8dcf37f
User-Agent: PostmanRuntime/7.3.0
Accept: */*
Host: localhost:60843
accept-encoding: gzip, deflate
content-length: 7
Connection: keep-alive
value=test
原始响应:
HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-SourceFiles: =?UTF-8?BQzpcUmVwb3NcVGVzdGJlZFxNb2RlbEJpbmRpbmdcTW9kZWxCaW5kaW5nXGFwaVx2YWx1ZXM=?=
X-Powered-By: ASP.NET
Date: Thu, 25 Oct 2018 15:23:49 GMT
21
{"":["The input was not valid."]}
0
再次注意,这是 Visual Studio 2017 中 asp.net web api 的默认模板。
一个有趣的事实是,如果我添加 Swashbuckle 并转到 swagger ui 端点并使用内置的“尝试”功能,它也会产生一个开箱即用的错误。
我已经让它可以与复杂类型和 json 主体一起使用,但我无法让简单类型工作,并且我尝试了各种不同的内容类型。
对于那些偶然发现这个问题的人,从版本 2.1 开始,默认应用自动模型绑定,如果模型绑定失败,则会返回 400 Bad Request(与早期版本的更改不同,早期版本要求您检查 ModelState.IsValid 以查看模型绑定是否成功) )。
当将简单类型发布到 ASP.NET Core 控制器操作时,您现在必须指定它的来源。可以推断复杂类型,但不能推断像 int 和 string 这样的简单类型(如果它们位于消息正文中。如果它们位于查询字符串或路由(url)中,则推断它们)。我看到在主体本身传递值的两个选项是:
- 通过 url 编码形式值的方式(添加[来自表格]到您的操作中的参数)
邮递员的请求:
POST http://your-url/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded
value=test
操作方法签名:
[HttpPost]
public void Post([FromForm]string value)
{
}
- 通过 json 正文(添加[来自正文]到您的操作中的参数)
邮递员的请求:
POST http://your-url/api/values HTTP/1.1
Content-Type: application/json
"test"
操作方法签名:
[HttpPost]
public void Post([FromBody]string value)
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)