asp.net-core - 如何规范化 ASP.NET Core API 结果中的 BadRequest(ModelState) 大小写
问题描述
我正在从 ASP.NET 控制器操作返回 BadRequest(ModelState),如下所示:
public class Person{
[MaxLength(40)]
public string Name{get;set;}
public double Height{get;set;}
}
public Put([FromBody]Person item){
if(!ModelState.IsValid) return BadRequest(ModelState);
//save to db
return Ok(item);
}
这可行,但是当 BadRequest 被序列化为 JSON 时,大小写似乎不一致。首先,对象序列化为 camelCase,正如预期的那样:
GET /api
{ name:'foo',
height: 11
}
如果错误是模型绑定失败,则外壳为驼峰式:
PUT /api {name:'bob',height:'foo'}
{
height:['Could not convert 'foo' to double']
}
如果错误是验证失败,则大小写为 PascalCased:
PUT /api {name:'morethan40characters', height:12}
{
Name:['Name should be between 0 and 40 characters']
}
我想我明白为什么会这样:模型绑定是从发布的以驼峰命名的 JSON 开始的,而验证是直接针对 .NET 类(即 PascalCased)进行的。
但是,API 消费者不会关心这种区别,并且会期望一致的大小写。尤其是在带有 Vue 或 Angular 之类的客户端 UI 中,让所有内容保持驼峰式或至少一致会更干净:
http.put('/api',item).then(x=>{...},e=>{ this.error=e.response.data });
...
<ul>
<li v-for="message in error.height">{{message}}</li>
<li v-for="message in error.Height">{{message}}</li>
<!-- line above smells -->
</ul>
<input type="text" v-model="item.height">
显然,我可以在客户端按摩错误响应,但是是否有一个标志或一些中间件我可以在服务器端执行以使其保持一致。最好是始终如一的驼峰式?
解决方案
尝试CamelCasePropertyNamesContractResolver
:
services.AddMvc().AddJsonOptions(options => {
options.SerializerSettings.ContractResolver =
new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
})
所以如果发送PUT /api {name: "xxxxx",height: 1111}
,结果将是:{"errors":{"name":["
推荐阅读
- ruby-on-rails - 如何使用删除功能向用户隐藏数据
- java - 如何解决错误:jarfile 无效或损坏
- ios - Objective-C 中的数据序列化(Avro 替代方案)
- java - 在 maven clean install 期间查找不同版本的组件(来自 pom 中定义的)
- python - Python 请求导致 401 未经授权
- javascript - 如何添加添加行按钮 React?
- javascript - 如何在没有 window.scrollBy(x, y) 的情况下上下滚动 HTML DOM(我需要在一个元素中向下滚动)
- sql - 我想通过在 sql 中的现有值之间插入 0(零)来更新表的列
- windows - Saltstack 对状态变化的操作
- java - 将两个 A5 横向 PDF 合并为单个 A4 纵向 PDF