[翻译]创建ASP.NET WebApi RESTful 服务(7)
实现资源分页
本章我们将介绍几种不同的结果集分页方式,实现手工分页,然后将Response通过两个不同的方式进行格式化(通过Response的Envelop元数据或header)。
大家都知道一次查询返回几百条数据是很讨厌的事情,那么在WebApi中分页就更有必要。
手动分页和封装
接下来我们修改CoursesController来实现分页而不是返回所有数据。
1: public Object Get(int page = 0, int pageSize = 10)
2: {
3: IQueryable<Course> query;
4:
5: query = TheRepository.GetAllCourses().OrderBy(c => c.CourseSubject.Id);
6: var totalCount = query.Count();
7: var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
8:
9: var urlHelper = new UrlHelper(Request);
10: var prevLink = page > 0 ? urlHelper.Link("Courses", new { page = page - 1 }) : "";
11: var nextLink = page < totalPages - 1 ? urlHelper.Link("Courses", new { page = page + 1 }) : "";
12:
13: var results = query
14: .Skip(pageSize * page)
15: .Take(pageSize)
16: .ToList()
17: .Select(s => TheModelFactory.Create(s));
18:
19: return new
20: {
21: TotalCount = totalCount,
22: TotalPages = totalPages,
23: PrevPageLink = prevLink,
24: NextPageLink = nextLink,
25: Results = results
26: };
27:
28: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
代码很简单,添加两个可选参数,它们最终会被格式化为QueryString。例如http://localhost:{your_port}/api/courses/?page=1代表你需要访问第一页的10条数据。不出意外,结果可能是这样的:
1: {
2:
3: "totalCount": 33,
4: "totalPages": 4,
5: "prevPageLink": "http://localhost:8323/api/courses?page=0&pageSize=10",
6: "nextPageLink": "http://localhost:8323/api/courses?page=2&pageSize=10",
7: "results": [ /* Array containts the results*/ ]
8:
9: }
结果是我们通过将数据封装为json通过Response的结果返回,这样记录总数也可以被返回。一个明显的缺点是这种类似的数据可能会污染我们期望的结果集,所以接下来我们通过在Response Header中添加一个X-Pagination参数来实现这一功能。
通过Response Header实现分页
实现代码如下:
1: public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10)
2: {
3: IQueryable<Student> query;
4:
5: query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName);
6:
7: var totalCount = query.Count();
8: var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
9:
10: var urlHelper = new UrlHelper(Request);
11: var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : "";
12: var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : "";
13:
14: var paginationHeader = new
15: {
16: TotalCount = totalCount,
17: TotalPages = totalPages,
18: PrevPageLink = prevLink,
19: NextPageLink = nextLink
20: };
21:
22: System.Web.HttpContext.Current.F.Add("X-Pagination",
23: Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));
24:
25: var results = query
26: .Skip(pageSize * page)
27: .Take(pageSize)
28: .ToList()
29: .Select(s => TheModelFactory.CreateSummary(s));
30:
31: return results;
32: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
需要注意代码中,我们在Response.Headers中添加了一个通过json序列化的分页参数。这样返回结果及就可以直接被使用,无法再考虑额外的信息。
来源:http://bitoftech.net/2013/11/25/implement-resources-pagination-asp-net-web-api/
[翻译]创建ASP.NET WebApi RESTful 服务(7)的更多相关文章
- [翻译]创建ASP.NET WebApi RESTful 服务(8)
本章讨论创建安全的WebApi服务,到目前为止,我们实现的API都是基于未加密的HTTP协议,大家都知道在Web中传递身份信息必须通过HTTPS,接下来我们来实现这一过程. 使用HTTPS 其实可以通 ...
- [翻译]创建ASP.NET WebApi RESTful 服务(11)
本章介绍通过使用Ali Kheyrollahi开发的CacheCow来实现服务器端的缓存.所有代码现在都可以在GitHub上下载. 我们将要实现的缓存方式叫做Conditional Requests, ...
- [翻译]创建ASP.NET WebApi RESTful 服务(9)
一旦成功的发布API后,使用者将依赖于你所提供的服务.但是变更总是无法避免的,因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要.一般来说,新的功能需要无缝的接入,有时新老版本需要并 ...
- [翻译]创建ASP.NET WebApi RESTful 服务(10)
通过URI实现版本管理 另一种实现版本管理的方式就是通过URI来进行处理,类似于http://localhost:{your_port}/api/v1/students/.这种方式的好处是使用者可以清 ...
- IIS 部署ASP.Net, WebAPI, Restful API, PUT/DELETE 报405错解决办法, webapi method not allowed 405
WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...
- Asp.net WebAPi Restful 的实现和跨域
现在实际开发中用webapi来实现Restful接口开发很多,我们项目组前一段时间也在用这东西,发现大家用的还是不那么顺畅,所以这里写一个Demo给大家讲解一下,我的出发点不是如何实现,而是为什么? ...
- 在windows10上创建ASP.NET mvc5+Memcached服务
感谢两位两位大佬: https://blog.csdn.net/l1028386804/article/details/61417166 https://www.cnblogs.com/running ...
- ASP.NET WebAPI 双向token实现对接小程序登录逻辑
最近在学习用asp.net webapi搭建小程序的后台服务,因为基于小程序端和后台二者的通信,不像OAuth(开放授权),存在第三方应用.所以这个token是双向的,一个是对用户的,一个是对接口的. ...
- [03-2]VS2017 创建 ASP.NET Core Web 程序
VS2017 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...
随机推荐
- Uploadify上传Excel到数据库
前两章简单的介绍了Uploadify上传插件的基本使用和相关的属性说明.这一章结合Uploadify+ssh框架+jquery实现Excel上传并保存到数据库. 以前写的这篇文章 Jq ...
- 【第七篇】bootstrap的3级菜单样式,支持母版页保留打开状态
razor视图的,母版页 依旧不多说,直接上代码 <ul class="sidebar-menu"> @for (int i = 0; i < mList.Cou ...
- Linux删除文件后空间没有释放
.COMMAND默认以9个字符长度显示的命令名称.可使用+c参数指定显示的宽度,若+c后跟的参数为零,则显示命令的全名.PID:进程的ID号.PPID父进程的IP号,默认不显示,当使用-R参数可打开. ...
- [反汇编练习] 160个CrackMe之027
[反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- 《深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础
1.1 ARM CPU寄存器 ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以要搞清楚ARM有哪些寄存器:ARM寄存器分为两类:普通寄存器和状态寄存器:普通寄存器一共有16个,分别为R0——R ...
- Linux C double linked for any data type
/************************************************************************** * Linux C double linked ...
- 学习java之HashMap和TreeMap
HashMap和TreeMap是Map接口的两种实现,ArrayDeque和LinkedList是Queue接口的两种实现方式.下面的代码是我今天学习这四个数据结构之后写的.还是不熟悉,TreeMap ...
- 【英语】Bingo口语笔记(48) - 关于春节的表达
- 定时组件quartz系列<二>quartz的原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便. 一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1. ...
- Java自动装箱拆箱
一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要in ...