【发布时间】:2013-10-05 18:45:54
【问题描述】:
我正在 Python Flask 中创建一个 REST API,并且想知道有哪些选项可以创建一个引用特定 git 标签的版本化 API。
我想要做的是指定 API 的版本,例如http://myapiserver.com/flaskapp/query/listcontent?version=1.1
然后将版本链接返回到我在 git 中标记为 v1.1 的代码。
有哪些选项以及管理此问题的最佳方法是什么?
【问题讨论】:
我正在 Python Flask 中创建一个 REST API,并且想知道有哪些选项可以创建一个引用特定 git 标签的版本化 API。
我想要做的是指定 API 的版本,例如http://myapiserver.com/flaskapp/query/listcontent?version=1.1
然后将版本链接返回到我在 git 中标记为 v1.1 的代码。
有哪些选项以及管理此问题的最佳方法是什么?
【问题讨论】:
我可以想到两种支持版本化 API 的方法,但都不会像您在问题中建议的那样让应用程序与自己的 git 存储库混淆。
例如,假设您有两个版本的 API,v1.0 和 v1.1。
直接的方法是将两个版本安装在不同的目录上运行,每个版本都在不同的 localhost 端口或 unix 套接字上侦听。这两个版本上的路由不需要嵌入版本,例如,两者都可以有一个/users 端点。将所有内容联系在一起的是一个反向代理(如 nginx),它通过使用版本控制的外部 URL 公开这两个 api,它将 /v1.0/users 映射到 v1.0 服务器,将 /v1.1/users 映射到 v1.1 服务器。
另一个选择是让您的 v1.1 服务器同时响应 v1.1 端点和 v1.0 端点。在这种情况下,服务器将具有路由中的版本,因此 v1.1 服务器将同时具有 /v1.0/users 和 /v1.1/users。起初这似乎很复杂,因为每个新的 API 版本都必须支持所有旧的 API,但它也可以被视为一种优化,因为对于不改变或版本之间差异最小的 API 端点可以用相同的代码处理它们:
@app.route('/<version>/users')
def users(version):
# do something
return jsonify(response)
【讨论】: