ASP.NET Web Api 实现数据的分页
前言
这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可能会在系列的后期介绍,还没确定。。。),对于分页的结果,我们将采用2种不同的方式响应给客户端(1.将分页元数据封装在响应Body中2.在http响应报文头部添加分页信息)。
众所周知,在服务器端一次性返回成百上千条数据是非常恐怖的,在我们设计Api的时候,对于Get方法我们应该以分页的方式返回。例如:每次响应给客户端10条数据,并且包含“上一页”和“下一页”的标签,这样用户就能去获得他想要的数据。
Way1.封装分页元数据封装在响应Body中
修改“CoursesController”的Get方法实现分页而不是一次性把所有数据返回,下面上代码:
public Object Get(int page = 0, int pageSize = 10){IQueryable<Course> query;query = TheRepository.GetAllCourses().OrderBy(c => c.CourseSubject.Id);var totalCount = query.Count();var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);var urlHelper = new UrlHelper(Request);var prevLink = page > 0 ? urlHelper.Link("Courses", new { page = page - 1 }) : "";var nextLink = page < totalPages - 1 ? urlHelper.Link("Courses", new { page = page + 1 }) : "";var results = query.Skip(pageSize * page).Take(pageSize).ToList().Select(s => TheModelFactory.Create(s));return new{TotalCount = totalCount,TotalPages = totalPages,PrevPageLink = prevLink,NextPageLink = nextLink,Results = results};}
解释一下上面的代码:
在Get方法上添加了2个有默认值的参数,这两个参数就是用来过滤我们查询结果集的——例如:我们想获取第2页的数据,那么对应的Get请求就应该是这种形式:http://localhost:{your_port}/api/courses/?page=1,注意:在这里我们只给了一个参数,那么pageSize就是默认值10.
客户端收到的部分响应就应该是:
{"totalCount": 32,"totalPages": 4,"prevPageLink": "http://localhost:3300/api/courses?page=0&pageSize=10","nextPageLink": "http://localhost:3300/api/courses?page=2&pageSize=10","results": [{"id": 11,"url": "http://localhost:3300/api/courses/11","name": "English Education 2","duration": 4,"description": "The course will talk in depth about: English Education 2","tutor": {"id": 4,"email": "Kareem.Ismail@outlook.com","userName": "KareemIsmail","firstName": "Kareem","lastName": "Ismail","gender": 0},"subject": {"id": 4,"name": "English"}},
Repository中GetAllCourses的返回值为IQueryable,因此在执行skip和take方法时并没有到SQL Server中执行SQL语句,最后查询的也是分页好的数据,体现出按需查询的特色。
在我们返回给客户端的数据中,其中分页元数据中包含了totalCount, totalPages, prevPageLink, nextPageLink这些数据,对于客户端来说我们返回totalCount, totalPages这两条数据非常有用,这样就可以与一些Grid配合使用来绑定结果。
通常来说我们会将分页元数据封装在响应Body中,对于开发者来说我们提供了所有分页信息。但有的API消费者因此只想获取它请求的数据而不需要分页元数据,那么他在解析响应结果是就会很费劲,因此这里出现了另一种方式来向客户端响应分页元数据——在响应报文头部附加分页元数据:Body部分只包含请求的资源,我们新增一个头部信息“X-Pagination”。
Way2.封装分页元数据到响应Header中
我们修改StudentsController来实现将分页元数据封装在Header中,使用这种方法后,需要分页元数据的客户端直接从Header部分获取,不需要的客户端直接解析响应的Body即可。
实现起来也非常简单,下面上代码:
public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10){IQueryable<Student> query;query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName);var totalCount = query.Count();var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);var urlHelper = new UrlHelper(Request);var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : "";var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : "";var paginationHeader = new{TotalCount = totalCount,TotalPages = totalPages,PrevPageLink = prevLink,NextPageLink = nextLink};System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));var results = query.Skip(pageSize * page).Take(pageSize).ToList().Select(s => TheModelFactory.CreateSummary(s));return results;}
这里我们添加了一个Header,里面包含一个Json序列化的分页元数据,客户端收到的响应:
总结
2种分页技术各有优劣,感觉碰到具体应用的时候再做选择了
ASP.NET Web Api 实现数据的分页相关推荐
- 利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
在Asp.net Web API中,对业务数据的分页查询处理是一个非常常见的接口,我们需要在查询条件对象中,定义好相应业务的查询参数,排序信息,请求记录数和每页大小信息等内容,根据这些查询信息,我们在 ...
- ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新( ...
- ASP.NET Web API 记录请求响应数据到日志的一个方法
原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-resp ...
- 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据
注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...
- ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题
最近开发微信小程序中用到了微信支付功能,接口开发用的ASP.NET WEB API: 在支付成功后,接口接受到微信服务器的支付通知结果,处理完数据,接口返回给微信服务数据时出现了问题. 微信服务器识别 ...
- 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session
原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...
- ASP.NET Web API 简介
本周早些时候,我写过一篇关于 ASP. NET MVC 4 测试版的博文.ASP. NET MVC 4 是一个重大的更新,它带来了一堆出色的新功能.我最兴奋的改进之一是为创建"Web ApI ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- ASP.NET Web Api 教程
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[七]--实现资源的分页 摘要: 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.h ...
最新文章
- 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战
- Android——通知栏提示 app 更新的进度,更新完可以访问授权进行安装。适配 8.0 版本
- 用Unity快速开发太空飞机大战游戏实战经验分享(上)
- 三星gtn8010安卓7_三星Galaxy Note 10.1 N8010 最后的救赎 Andorid 5.0.2 ROM
- Python人工智能之路 - 第一篇 : 你得会点儿Python基础
- MATLAB2016b 下载,破解,安装
- nginx启动重启与升级以及检测配置文件
- bat 自动输入密码_「docker实战篇」python的docker爬虫技术移动自动化uiautomator工具(16)...
- 使用WndProc来处理消息
- 万能平板刷机软件_一加万能工具包(手机万能刷机工具)
- 用友T1-商贸宝库存商品明细账
- 获取随机数的n种方法,你知道几种
- 浙大图灵班今年首次招生:院士授课,本科生配学业导师
- 学会python,妈妈再也不用担心我乱花钱了!
- php 根号2计算过程,根号换算(开方计算器在线)
- 无线wifi打印机服务器原理,一般无线打印机的连接方法及遇到常见故障解决办法...
- H5的Notification特性
- oracle 12cR2 版本发布时间 2HCY2016
- 情人节,送女友一桶代码可否?
- 定制office2007静默安装版
热门文章
- c语言实现stack的算法(附完整源码)
- C/C++中extern的用法 ?
- php网站评论代码,PHP评论代码帮助
- web展现mysql_web页面实现LED跑马灯效果(涉及web前端、原生JS、PHP、mysql)
- kylin调优,项目中错误总结,知识点总结,kylin jdbc driver + 数据库连接池druid + Mybatis项目中的整合,shell脚本执行kylin restapi 案例
- Spring+Hibernate+Struts2整合所需要的Jar包
- android adb 联系人,使用adb命令向Android模拟器中导入通讯录联系人的方法
- 文件上传获取file的全路径名_Java中的File类与I/O流
- python连接各种数据库数据_Python连接各种数据库
- 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归