我正在devise一个JSON API,并且我想使用某种内容协商来对API进行版本化。 我目前正在计划使用供应商的MIMEtypes来做到这一点。
虽然我完全可以在应用程序级别做到这一点,但我认为最好在HTTP服务器级别做到这一点。 这是可能的Apache或Nginx的?
Content-Type看起来像: application/vnd.vendorname-v1+json
或可能使用参数: application/vnd.vendorname+json;v=1
Nginx对这类问题的惯用方法是通过map
。 请在StackOverflow中查看我的答案 。
基本上,你在http
部分定义一个map
map $any_variable $my_upstream { # Default value: default upstream1; # Exact match: application/vnd.vendorname+json;v=1 upstream2; # Regexp: ~^application.*vnd.vendorname-v1\+json upstream3; }
您可以在一张地图中混合完全匹配和正则expression式。
然后,只需在server
或location
部分中使用$my_upstream
即可:
location / { proxy_pass http://$my_upstream$uri; }
Nginx懒惰地评估地图variables,只有一次(每个请求),当你使用它们。
当然; Apache的mod_rewrite
可以用一点点RewriteCond
来做到这一点,虽然我有点生疏,给我一个例子,我的头顶。 在nginx中,它看起来像下面这样(假设你定义了两个上游,一个用于你的jsonapp,另一个用于… otherstuff):
if ($content_type = application/vnd.vendorname-v1+json) { proxy_pass http://jsonapp/ break; } proxy_pass http://otherstuff/
我会违背其他人的build议。
我认为依靠从HTTP服务器版本化JSON API是一个非常糟糕的主意。 HTTP服务器对你正在开发的API一无所知。 这就像在一个文本文件中定义Linux版本,而不是将其构build到内核源代码中。 它使升级更复杂。
它所需要的只是一个错误的结构,它可能会让下一个不了解复杂设置的人感到痛苦。
不知道你在做什么,必须有一种方法可以使用你的脚本语言(你使用的是脚本语言,还是这是一个自定义的JSON响应者?)。 即像JavaScript中可用的全局variables。 或者根据请求返回它,获取API版本的JSON请求。 或者始终在响应前面的所有JSON响应中发送它。 毕竟这是很less的文字。
使用KISS方法,你不会后悔的。