[翻译]创建ASP.NET WebApi RESTful 服务(9)
一旦成功的发布API后,使用者将依赖于你所提供的服务。但是变更总是无法避免的,因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要。一般来说,新的功能需要无缝的接入,有时新老版本需要并行,以便给使用者足够的时间来进行迁移和配套的变更。设置,老的版本会一直持续被使用。
简单版本管理
假设我们现在对StudentsController进行修改,将GET方法中返回“FirstName” 和 “LastName”修改为返回“FullName”和 “CoursesDuration”。
最简单的方法就是新建一个类似于StudentsV2Controller的新服务。请留意V2,接下来将依赖这个引入管理策略。这种方法来自于Shawn Wildermuth的plural sight course文章。旧版本的服务返回的json应该是这样的:
1: [{
2: "id": 2,
3: "url": "http://localhost:8323/api/students/HasanAhmad",
4: "firstName": "Hasan",
5: "lastName": "Ahmad",
6: "gender": 0,
7: "enrollmentsCount": 4
8: },
9: {
10: "id": 3,
11: "url": "http://localhost:8323/api/students/MoatasemAhmad",
12: "firstName": "Moatasem",
13: "lastName": "Ahmad",
14: "gender": 0,
15: "enrollmentsCount": 4
16: }]
而新版本的返回如下:
1: [{
2: "id": 2,
3: "url": "http://localhost:8323/api/students/HasanAhmad",
4: "fullName": "Hasan Ahmad",
5: "gender": 0,
6: "enrollmentsCount": 4,
7: "coursesDuration": 13
8: },
9: {
10: "id": 3,
11: "url": "http://localhost:8323/api/students/MoatasemAhmad",
12: "fullName": "Moatasem Ahmad",
13: "gender": 0,
14: "enrollmentsCount": 4,
15: "coursesDuration": 16
16: }]
新版本的GET函数的实现为:
1: public IEnumerable<StudentV2BaseModel> 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 = 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.Response.Headers.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.CreateV2Summary(s));
30:
31: return results;
32: }
StudentV2BaseModel和CreateV2Summary只是为了举例方便,实际可以根据需要是否要进行这样的修改或者无须修改。
具体的代码如下:
1: public class StudentV2BaseModel
2: {
3: public int Id { get; set; }
4: public string Url { get; set; }
5: public string FullName { get; set; }
6: public Data.Enums.Gender Gender { get; set; }
7: public int EnrollmentsCount { get; set; }
8: public double CoursesDuration { get; set; }
9: }
10:
11: public class ModelFactory
12: {
13: public StudentV2BaseModel CreateV2Summary(Student student)
14: {
15: return new StudentV2BaseModel()
16: {
17: Url = _UrlHelper.Link("Students", new { userName = student.UserName }),
18: Id = student.Id,
19: FullName = string.Format("{0} {1}", student.FirstName, student.LastName),
20: Gender = student.Gender,
21: EnrollmentsCount = student.Enrollments.Count(),
22: CoursesDuration = Math.Round(student.Enrollments.Sum(c => c.Course.Duration))
23: };
24: }
25: }
来源:http://bitoftech.net/2013/12/16/asp-net-web-api-versioning-strategy/
转载于:https://www.cnblogs.com/tukzer/p/3664153.html
[翻译]创建ASP.NET WebApi RESTful 服务(9)相关推荐
- 使用Hot Chocolate创建ASP.NET Core GraphQL服务
GraphQL介绍 GraphQL是一个用于API的查询语言,是一个使用基于类型系统来执行查询的服务端运行时.GraphQL对你的API中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它 ...
- 《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
创建ASP.NET Core Web应用程序 如果您使用的是VS2017请看 VS2017创建ASP.NET Core Web程序(三) 在这个视频中我们将讨论 可用的不同项目模板及其功能 预制的项目 ...
- VS2017创建ASP.NET Core Web程序
创建ASP.NET Core Web应用程序 如果您使用的是VS2019 请看 VS2019创建ASP.NET Core Web程序 在这个视频中我们将讨论 可用的不同项目模板及其功能 预制的项目模板 ...
- 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
由于给予REST的Web服务非常简单易用,它越来越成为企业后端服务集成的首选方法.本文这里介绍一下如何通过微软的Asp.Net WebAPI快速构建REST-ful 服务. 首先创建一个Asp.Net ...
- vert.x_使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务
vert.x 中断了将近半年后发表了一篇新文章. 在本文中,我们将快速了解如何开始使用vert.x,更有趣的是,如何使用RxJava简化异步系统的编程. 我们将涵盖以下主题: 使用Maven创建一个空 ...
- 使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务
中断了将近半年后发表了一篇新文章. 在本文中,我们将快速了解如何开始使用vert.x,更有趣的是,如何使用RxJava简化异步系统的编程. 我们将涵盖以下主题: 使用Maven创建一个空的vert.x ...
- java http服务_springboot官方例子中文翻译--RESTful服务启用CORS支持
本指南将引导您完成使用Spring创建"hello world"RESTful Web服务的过程,该服务在响应中包含用于跨源资源共享(CORS)的头文件. 因安全考虑,浏览器会禁止 ...
- Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务
Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务_IT_ziliang的博客-CSDN博客 WebSocket是一种在单个TCP连接上进行全双工 ...
- asp.net webapi 自托管插件式服务(转)
webapi问世已久,稀里糊涂的人哪它都当mvc来使,毕竟已mvc使用级别的经验就可以应对webapi. webapi和mvc在asp.net5时代合体了,这告诉我们,其实 它俩还是有区别的,要不现在 ...
最新文章
- (译)第一次Android开发单飞
- vivado调用modelsim
- 数值格式化,每隔三位加一个逗号
- class类文件结构
- 【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)
- 软件项目管理0819:一页项目管理——风险,定性问题和其他评价指标
- Lesson 1#03-Python安装与Hello Python World
- SharpMap学习(2)
- WiMAX版图不止3G
- 关闭防火墙linux 16.04,如何在Ubuntu 16.04上配置和设置防火墙
- 机器学习——逻辑回归算法代码实现
- python前三周学习心得
- 菜鸟运维笔记:小记编译安装Nginx所遇到的坑
- python-Matplotlib数据可视化
- addon游戏_SnowMobile Addon
- python 使用图形化界面tkinter显示图片 规定大小!
- Java基于JSP的网络音乐KTV点歌电台网站
- HIve数仓新零售项目DWD层的构建
- html中伪类定义,伪类
- 脑注意力机制启发的群体智能协同避障方法
热门文章
- js在wap端获取定位_iPhone 定位服务,没用的都关掉
- CBOW模型正向传播、矩阵乘积层实现
- oracle数据库主键消失,oracle数据库提示找不到主键
- java map转string_【库学科技】32道常见的Java基础面试题
- python颜色表_Python+matplotlib绘制不同大小和颜色散点图实例
- linux6.5如何打开ftp服务,CentOs6.5上快速搭建ftp服务器
- 挑战记忆力-Web前端实现记忆纸牌游戏(JS+CSS)
- java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
- mysql blob 好处_MySQL中的BLOB类型
- 中软python编码规范考试试题_卓越分享 | 如何写出一手漂亮的Python代码?