是否有可能通过内容types路由请求到不同的应用程序?

我正在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式。

然后,只需在serverlocation部分中使用$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方法,你不会后悔的。