在最近的一次演讲中,Sebastien Lambla指出,通过在URI中增加版本或者使用带有版本的媒体类型将Web API版本化在开放网络上是行不通的。我们真正需要的是,协定随着我们需要的变化而演化。此外,他还描述了避免版本化需求的方法。

\\

Lambla是一名REST架构风格顾问和倡导者。在他看来,版本化Web API的一个常见的原因是,避免我们使用的协定破坏客户端。我们希望客户端和服务器可以独立地修改,并且能够将API变化传达给客户端开发人员。Lambla认为,从根本上讲,版本化是一种管理耦合的方法,本质上是一种变更控制。

\\

一种版本化方法是在URI中增加版本,像这样:http://api.equestrian.magic/v1/。这样做的问题是,当URI指向一个资源(比如客户),其变化会导致使用旧的URI无法找到资源,除非我们使用重定向。Lambla强调,资源URI永远都不应该变化,但如果使用一个新版本,它就有两个不同的URI了,这通常表示两种不同的东西,它们之间无法相互关联。

\\

另一种方法是在域名中增加版本:http://v1.api.equestrian.magic/。这样,在实际创建一个新系统时,URI就会变得难以理解。有多个系统和模型,但都是指向相同的数据模型,这会增加维护的困难。

\\

第三种方法是使用带有版本的媒体类型。Lambla认为,这种方法如今在Web上已经比较少见,但在企业中还相当常见。它以内容协商为基础,在Accept和Content-Type头信息的媒体类型中增加一个版本号:application/vnd.equestrian.ponies.v1+xml。Lambla指出,不同的版本实际上还是不同的资源,在同一个URI上使用不同的媒体类型会破坏资源标识符。他援引Roy Fielding的话来说明他的观点:

\\

\

当格式之间的不同实际上只是细节上的差别时,我们鼓励资源所有者仅仅使用真正的内容协商(不使用重定向)

\

\\

在Lambla看来,在开放网络上,这些版本化技术没有一种可行。我们真正需要的是可以演化的东西,使用可以随着我们需要的变化而平滑演化的协定。在Lambla看来,这是一个很好理解的问题,而且与Web相关;数以百万计的微服务已经运行25年,也没有出现太多的问题,除了HTTP之外,也没有版本化。

\\

可演化协定的第一个基础是向后兼容。Lambla举了HTML的例子。HTML有许多停用的元素,但它们仍然为客户端所支持,因为我们无法升级世界上所有的站点。同样的原则也应该运用在API上,因为它在演化的过程中仍然必须支持旧格式。

\\

第二个基础是向前兼容。为了做到这一点,你必须忽略未知或者没有理解的东西。Lambla举了CSS的例子。在CSS中,新属性会得到处理,没有任何问题。为了做到这一点,未知属性会使用回退原则来处理,这是一种获得扩展点的重要方式。

\\

XML仍然很常用,而且经常和XML模式一起使用。这时,为了支持演化,我们必须保证内容的灵活性。因此,Lambla强烈建议不要在服务器以及客户端上验证模式。相反,我们应该只是找出我们需要的元素和属性,而忽略其他部分。

\\

为了避免版本化,我们需要继续支持所有的特性,但我们不能将所有的变化永远都保留在API中。应该删除很少使用的旧特性。为了知道什么时候可以删除,我们需要使用指标度量使用情况。然后,我们就可以确定,比如,当使用率降到1%以下时,删除特性。

\\

查看英文原文:Don’t Version Your Web API

切勿版本化Web API相关推荐

  1. 使用.NET Core 3.0 预览版,Web API和Visual Studio 2019进行ASP.NET Core Blazor游戏开发

    目录 介绍 使用ASP.NET核心Blazor创建这个奇怪的图像输出应用程序应该知道什么? 背景 先决条件 Visual Studio 2019 .NET Core 3.0 Preview SDK B ...

  2. 使用SpringMVC创建支持向下兼容的版本化的API接口

    2019独角兽企业重金招聘Python工程师标准>>> 原文:http://www.cnblogs.com/jcli/p/springmvc_restful_version.html ...

  3. 如何版本化你的API?--转

    原文地址:http://www.infoq.com/cn/news/2017/09/How-versioning-API 如何版本化API需要考虑各种实际业务场景,但是一个完备的API应该是: 和客户 ...

  4. MongoDB 5.0 来了,原生时序、版本化 API 新特性悉数登场

    作者 | 伍杏玲 出品 | CSDN云计算(ID:CSDNcloud) 据 DB-Engines 数据库最新 7 月流行度排行榜显示,前五名十分稳定:Oracle.MySQL.Microsoft SQ ...

  5. facebook网页版登录_微信网页版关闭登录将影响一大批使用itchat等Web Api方案的微信机器人...

    微信网页版限制登录或禁止登录将影响一大批使用itchat等Web Api方案的微信机器人 网页版微信 API 被封了,像使用 itchat wxpy wxbot等基于 web API 的微信 robo ...

  6. Wind(万得)原生TDBAPI(JAVA版)封装成 WEB API (Demo版)

    ##1. 引言## 目前项目使用了开源的vnpy框架来做量化交易(python版), 但是公司采购的wind历史数据TDBAPI没有python版(只有C++版,JAVA版,C#版,matlab版). ...

  7. 微信小程序上传图片,web api后台接收(完全版)

    插播一条广告:软件设计师考试系统: 本人自己开发的网址: http://94.191.14.138:8025/Html/Customer/Main.html#/Index 今天花了一天时间,研究了微信 ...

  8. 葫芦侠图床带API网站源码 切勿非法用途

    介绍: 葫芦侠图片外链服务 稳定不掉线 免费使用 温馨提示: 本源码不存储且无权管理上传的图源, 图源均存放在葫芦侠服务器,切勿上传违反法规图源,否则后果自负. 网盘下载地址: http://keke ...

  9. VBS 请求WebAPI接口_如何设计WEB API

    前言 我一直认为WEB API设计是后端工程师的活,对WEB API设计规范理解的不是很深,正是因为之前看过不同后端工程师的Web API设计难以对接前端产品,导致经常需要修改接口,浪费了很多时间,专 ...

最新文章

  1. 无记忆多项式数字预失真技术
  2. 使用Dezender对zend加密后的php文件进行解密
  3. 进制转换应用场景_远程教育计算机应用基础统考知识点集中训练(二)_统考信息_网络远程教育...
  4. UIScrollView事件拦截
  5. OpenCV绘图和注释
  6. python字符串转64位数字_python-将String转换为64位整数映射字符以自定义两位值映射...
  7. ❤️20行Python代码❤️一键整理桌面、文件夹❤️世界都清净了❤️
  8. 谷歌医疗AI又有新进展:转移性乳腺癌检测准确率达99%
  9. webbench之编译安装(一)
  10. 计算机中内存、cache和寄存器之间的关系及区别
  11. qpython3安装kivy_kivy学习之路:kivy开发环境架设--- windows篇
  12. 怎么开发直播短视频源码?
  13. 以什么样的模式和方式来解决问题或创造价值?
  14. 江苏省职称计算机word2003教材,[205]Word 2003中文字处理 考试大纲
  15. 怎么通过django模板输出双花括号{{}}
  16. 项目经理在汇报中的三个重点
  17. html页面如何拉长,HTML可以拉长的logo
  18. 搭建微信小程序转码机器人教程
  19. 三、CRUD(增删改查)
  20. win7 打开图片提示内存不足

热门文章

  1. RedHat Enterprise Linux Server 5 安装序列号
  2. 反弹和补遗:再论Bjarne Stroustrup的基于对象的含义
  3. python日历gui_python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例...
  4. Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>> *‘ with an rvalue of type ‘NSArr
  5. 计算机网络智能化在铁路通信的发展,计算机网络在铁路信号中的应用
  6. JButton 圆角_ProE、Creo在玩具轿车设计中的一个案例应用解析|轿车|玩具|圆角
  7. Swift 1.1语言快速入门7.2使用无参函数
  8. Unity 2D游戏开发快速入门(内部资料)
  9. 内存储器和cpu一起构成了计算机,计算机系统的组成
  10. itstime后面跟什么_一文讲透什么是引流