【发布时间】:2016-11-29 10:08:56
【问题描述】:
FooBar Api 已发布
假设有一个开发团队正在开发一个名为 FooBar api 的 API,并带有几个端点:
GET /foo
# returns {'bar': '/bar', 'data': 'foo'}
GET /bar
# returns {'data': 'hello world!'}
现在,假设FooBar api 爆发并变得非常流行。来自世界各地的开发人员都在使用FooBar api,现在成千上万的项目完全依赖它。
问题
FooBar api 最近有了新的项目经理。他说,现在希望响应返回 message 而不是 data,因为 message “更具描述性”。不幸的是,对FooBar API 的任何更改都可能破坏数以千计的此类项目。尽管所有这些项目被破坏的开发人员大多会耐心并理解变化,FooBar 团队不想破坏他们自己的依赖项目并决定最好保持 api 向后兼容。
解决方案
FooBar api 需要进行版本控制。不幸的是there is no good way to do this。幸运的是FooBar 团队,他们的项目经理最了解并决定应该通过在 url 中放置版本号来完成版本控制,因为“这是他可以看到的部分”。因此,一旦FooBar api 的第二个版本完成,这两个版本应该如下所示:
FooBar v1
GET /foo
# returns {'bar': '/bar', 'data': 'foo'}
GET /bar
# returns {'data': 'hello world!'}
FooBar v2
GET /v2/foo
# returns {'bar': '<url to bar>', 'message': 'foo'}
GET /v2/bar
# returns {'message': 'hello world!'}
第二个问题
FooBar 团队现在有另一个问题;他们不知道<url to bar> 应该写什么。在几乎无限可能的字符排列中,他们令人印象深刻地能够将其归结为两个选择 - /v2/bar 和 /bar。
问题
使用/v2/bar 和/bar 的优缺点是什么?
【问题讨论】:
-
如果
/foo没有改变,那为什么要为它发布/v2路由呢? -
@cricket_007 在这个例子中,我为
/foo发布了一个/v2路由,用于说明目的。我很想知道应该如何为v2响应构建 url。既然您提出了一个好观点,我将更改示例以证明绝对应该为/foo发布v2路由。
标签: python api rest flask api-versioning