用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH (4)

我之前还没有为EFCore的model添加约束,这里我添加上(由于我使用的是内存数据库,所以下面的约束是不起作用的,这些约束只有在关系型数据库才起作用):

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH

对于EFCore的实体约束和验证,我不愿意使用注解的方式(因为Model类应该只干自己的活),更喜欢使用fluent api

然后把这两个类添加到DbContext里面的OnModelCreating方法里即可:

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH

虽然上面的代码对内存数据库没有用,但是我还是添加上吧。

如果一个HTTP请求造成了EFCore model的验证失败,如果返回500的话,感觉就不太正确。因为如果是500错误的话,就意味着是服务器出现了错误,而这实际上是API消费者(客户端)提交的数据有问题,是客户端的错误。所以返回的状态码应该是 4xx 系列。

此外,目前这些验证规则是处于EFCore 的实体上的,而报告给API消费者的验证错误信息应该定义在Resource这一层面上,所以下面就为Resource model定义验证规则:

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH

所有的验证注解可以查看官方文档:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations(v=vs.110).aspx

(这种方式比较简单,但是把验证和Model混合到了一起,所以很多人还是不采用这种方式的)。

验证规则定义完了,下面来实施规则检查。这时就需要使用ModelState了。

每当请求进入到这个方法的时候,都会验证我们刚刚定义在Resource上的这些约束,如果其中一个约束没有达标,则ModelState的IsValid属性就会是false;此外如果传进来的属性类型和定义的不符,IsValid属性也会是false。

这里返回状态码 422 是正确的选择,但是 422 要求请求的body的语法必须是正确的,不能是null,所以前面检查是否为null的代码还需要保留。

由于ASP.NET Core并没有内置的帮助方法可以返回422和验证错误信息,所以我们先建立一个类用于返回 422 和验证错误信息,它继承于ObjectResult

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH

其中的SerializableError定义了一个可以被串行化的容器,该容器可以以Key-Value对的形式来保存ModelState的信息。

回到CityController的POST的Action方法,只添加这部分代码即可:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpssgj.html