Spring REST实践之Versioning,Paging和Sorting
Versioning
为适应需求的变化以及兼容已有的API,需要创建新版本的API,一般有四种流行的版本化API的方法:
URI版本化
URI参数版本化
Accept header版本化
自定义header版本化
URI版本化
在这种方法中,版本信息变成了URI一部分。例如:
LinkedIn: https://api.linkedin.com/v1/people/~
Yahoo: https://social.yahooapis.com/v1/user/12345/profile
SalesForce: http://na1.salesforce.com/services/data/v26.0
Twitter: https://api.twitter.com/1.1/statuses/user_timeline.json
Twilio: https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Calls
URI版本化的方式,可以在URI中就可以展示版本信息,方便API的开发和测试,能够通过浏览器访问不同版本的API服务。但是,也会给client生命周期带来复杂性,比如,client保存了存在数据库中的用户资源的引用,为了切换到新版本的API,client必须对资源引用执行复杂的升级操作。
URI参数版本化
版本作为URI的参数,例如:http://api.example.org/users?v=2,用参数v表示版本二的API。此方式具有与URI版本化一样的优点和缺点。
Accept header版本化
此方式通过Accept header交互版本信息,因为header中包含了版本信息,所以多个版本的API可以使用同一个URI。为了传递版本信息,需要自定义资源类型,一般自定义的格式为:vnd.product_name.version+ suffix,vnd是自定义资源类型的起始点;product_name是资源的名称,用于区分其他资源类型;version是版本信息;suffix表示资源类型。例如application/vnd.quickpoll.v2+json。
因为不用更改整个API就可以访问资源,Accept header版本化方式变得越来越流行,但是这种方式使通过浏览器测试变得困难。
自定义header版本化
自定义header版本化,和Accept header方式一样,除了自定义header,而不是使用Accept header。因为HTTP规范提供了通过accept header的标准方式,所以此种方式没有被广泛的采用。
过期API的处理方式
当有新版本API发布时,会有一些API过期,但是不应该立即过期,应该再维护一段时间,在这段时间里提醒用户应该迁移到新版本的API。
Paging
REST api的消费者包括桌面应用、web应用、移动应用。出于对带宽和性能的考虑,都不应该直接返回一个大数据集,应该采用分页。有四种分页的方式:page number分页、limit offset分页、cursor-based分页、time-based分页。
page number分页
在这种风格中,用户指定他们需要的数据的页码。例如:
http://blog.example.com/posts?page=3
http://blog.example.com/posts?page=3&size=20
https://api.github.com/user/repos?page=2&per_page=100
server针对分页返回的响应可以像下面这样:
{
"data": [
... Blog Data
],
"totalPages": 9,
"currentPageNumber": 2,
"pageSize": 10,
"totalRecords": 90
}
limit offset分页
在这种风格中,用户指定limit和offset两个参数,限定他们需要的数据。例如:
http://blog.example.com/posts?limit=10&offset=30
cursor-based分页
在这种风格中,用户利用指针或者游标导航要访问的数据集。例如:用户发送一个http://blog.example.com/posts请求,server端返回:
{
"data" : [
... Blog data
],
"cursors" : {
"prev" : null,
"next" : "123asdf456iamcur"
}
}
用户再访问时,可使用如下URI:http://api.example.com/posts?cursor=123asdf456iamcur
time-based分页
在这种风格中,用户指定一个时间片用于检索数据。例如:
https://graph.facebook.com/me/feed?limit=25&until=1364587774
https://graph.facebook.com/me/feed?limit=25&since=1364849754
Sorting
Sorting让用户能够决定依据那列队数据集进行排序。一般的排序形式如下所示:
http://blog.example.com/posts?sortByDesc=createdDate&sortByAsc=title
http://blog.example.com/posts?sort=createdDate,desc&sort=title,asc
http://blog.example.com/posts?sort=-createdDate,title
Spring REST实践之Versioning,Paging和Sorting的更多相关文章
- WebGrid with filtering, paging and sorting 【转】
WebGrid with filtering, paging and sorting by Jose M. Aguilar on April 24, 2012 in Web Development A ...
- Spring+MyBatis实践—MyBatis数据库访问
关于spring整合mybatis的工程配置,已经在Spring+MyBatis实践—工程配置中全部详细列出.在此,记录一下几种通过MyBatis访问数据库的方式. 通过sqlSessionTempl ...
- Spring MVC 实践 - Component
Spring MVC 实践 标签 : Java与Web Converter Spring MVC的数据绑定并非没有任何限制, 有案例表明: Spring在如何正确绑定数据方面是杂乱无章的. 比如: S ...
- Spring MVC 实践 - Base
Spring MVC 实践 标签 : Java与Web Spring Web MVC Spring-Web-MVC是一种基于请求驱动的轻量级Web-MVC设计模式框架, Spring MVC使用MVC ...
- Spring Boot实践——Spring AOP实现之动态代理
Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...
- Spring Boot实践——AOP实现
借鉴:http://www.cnblogs.com/xrq730/p/4919025.html https://blog.csdn.net/zhaokejin521/article/detai ...
- Spring Boot 实践 :Spring Boot + MyBatis
Spring Boot 实践系列,Spring Boot + MyBatis . 目的 将 MyBatis 与 Spring Boot 应用程序一起使用来访问数据库. 本次使用的Library spr ...
- Spring Batch实践
Spring Batch在大型企业中的最佳实践 在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后 ...
- Spring REST实践之Spring Boot
Spring Boot基本描述 可以利用http://start.spring.io网站的进行Spring Boot的初始化构建.这个初始化构建器允许你输入工程基本信息.挑选工程支持的功能,最后会生成 ...
随机推荐
- I.MX6 ov5640 camera
/************************************************************************ * I.MX6 ov5640 camera * 说明 ...
- 【转】Ubuntu 12.04 安装JDK 8和Eclipse
原文网址:http://blog.csdn.net/yechaodechuntian/article/details/24853813 Ubuntu 12.04 下安装 JDK8 方法一:(缺点是安装 ...
- 剖析OkHttp缓存机制
现在应用市场上的 App 无一不需要网络操作,这些应用的开发者大多数都选择结合使用 OkHttp 和 Retrofit 来完成网络操作.okHttp 最为人称道的一个特性就是它的缓存机制,而我将在本篇 ...
- MySQL基础之第15章 MySQL用户管理
15.2.账户管理 15.2.1.登录和退出MySQL服务器 mysql –hhostname|hostIP –P port –u username –p[password] databaseName ...
- Symfony2 学习笔记之插件格式
一个bundle类似于其它框架中的插件,但是比插件表现更好.它跟其它框架最主要的不同是在Symfony2中所有东西都是bundle,包括核心框架功能和你写的所有应用程序代码.Symfony2中,bun ...
- 使用服务器端控制AJAX页面缓存
你知道 response.setHeader("Cache-Control","no-cache"); 这条语句是干什么的吗? 这是用来防止浏览器缓存动态内容生 ...
- java 调用 .net webservice
1.首先下载Axis2工具包 2.解压之后用cmd命令进入bin目录WSDL2Java.bat -uri http://192.168.20.42:9999/LoginService.asmx?wsd ...
- C#实现不安装Oracle客户端访问远程服务器数据!!
概述: C#通过使用ADO的方式在未安装Oracle数据库的前提下,客户端程序远程访问服务器,会出现:“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或 ...
- <面试经典题>输入框的功能测试点分析
(废话几句:这个是网上找来的一份模板,高亮部分为自己修改内容,且此面试题很像当年高考的“必考题”性质,触类旁通吧) 1. 输入框UI是否预计了输入内容长度(尽量完整的显示输入内容): 2. 输入框之前 ...
- DTD 简介
文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构.DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. 内部的 DOCTYPE 声明 假如 DT ...