用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里:https://www.cnblogs.com/cgzl/p/9047626.html 和 https://www.cnblogs.com/cgzl/p/9080960.html

本文需要的代码 (右键另存,把后缀改为zip):https://images2018.cnblogs.com/blog/986268/201806/986268-20180604151009219-514390264.jpg

本代码已经更新至ASP.NET Core 2.1. (从ASP.NET Core 2.0 迁移至 ASP.NET Core 2.1: https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1)

 

本文主要介绍一些常见情况的实现,包括:集合更新、翻页、排序、过滤等等。但是仍然是Richardson成熟度顶多为2级的Web API,未达到RESTful API的标准和约束。

 

集合的更新操作

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

 

看这种更新集合的情况,原来数据库里中国存了4个城市(北平,上海,盛京,海参崴);而几个世纪后北平改名叫北京了,盛京名为沈阳了,海参崴不属于中国了就删除了,威海从县成为市就算是新增,而上海保持不变。现在就是要对中国的城市进行整体性的更新操作,里面会包含:添加、删除、更新操作。看代码:

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

集合更新,我一共分了三步进行的操作:

1. 把数据库中存在的但是传进来的数据里没有的城市删掉

2. 把数据库中没有的而传进来的数据里有的数据进行添加操作,其实这里只判断id为0即可

3. 把数据库中原有和传进来的参数里也存在的数据条目进行更新。

然后保存即可。

先看一下原有的数据:

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

然后我们执行集合的更新:

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

执行之后,再次查询:

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

集合按预期更新了。

我相信大家肯定会写这段代码,或者有更简单的实现方式(请贴出来)。但这不是重点,我看到有人这样写,把上面那三步代码写在了AutoMapper的配置文件里:

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

首先,需要忽略Country的Cities属性的映射操作,然后把那部分代码写在AfterMap里面即可,这样在Action方法里面就简单了,可以使用Automapper了:

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

这只是一种可选的写法而已,不一定就必须放在AutoMapper的配置文件里。

 

翻页

翻页可以避免一些性能问题,不必一次性加载所有数据。所以最好默认就采用分页,而且每页的条目数量必须有限制,不能太大。

分页信息应该使用查询字符串(query stringg)传递参数。格式应该这样:

:5000/api/country?pageIndex=12&pageSize=10

这里我喜欢使用pageIndex这个词,这也意味着页数是从0开始的;当然很多人喜欢用pageNumber等词,也就是说更喜欢页数从1开始,这个其实随意吧。

在ASP.NET Core里,我要使用Linq来动态组建一个查询的表达式(IQueryable<T>,可以创建表达式树),它是延迟执行的,直到各种条件都判断完了并组建出最终的查询表达式之后才去执行(查询数据库)。这个查询表达式只有在进行迭代的时候才会查询数据库。

触发迭代动作可以使用下面的方法:

foreach 循环

ToList(), ToArray(), ToDictionary() 以及相应的异步版本(ToXxxxAsync())

单项查询,例如 Average(), Count(), First(), FirstOrDefault(), SingleOrDefault()等等,以及相应的异步版本。

需要确保的是要在迭代发生之前,使用Skip()和Take()以及Where()。

下面我一点一点来写代码:

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

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