我正在设计一个 JSON API,我想使用某种内容协商来对 API 进行版本控制。我目前计划使用供应商 MIME 类型去做这个。
虽然我可以在应用程序级别执行此操作,但我认为最好在 HTTP 服务器级别执行此操作。使用 Apache 或 nginx 可以做到这一点吗?
Content-Type 看起来像这样:application/vnd.vendorname-v1+json
或者可能使用参数:application/vnd.vendorname+json;v=1
答案1
Nginx 处理此类问题的惯用方法是通过map
。请参阅我在 StackOverflow 上的回答。
map
基本上,你在http
部分中定义一个
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;
}
您可以在一个映射中混合精确匹配和正则表达式。
然后您只需$my_upstream
在您server
或location
部分中使用:
location / {
proxy_pass http://$my_upstream$uri;
}
Nginx 以惰性方式评估映射变量,仅评估一次(每个请求)并且仅在您使用它们时进行。
答案2
当然;Apachemod_rewrite
可以用一点点 来实现这一点RewriteCond
,尽管我有点生疏,无法给你举个例子。但在 nginx 中,它看起来类似于以下内容(假设您定义了两个上游;一个用于您的 jsonapp,另一个用于...其他内容):
if ($content_type = application/vnd.vendorname-v1+json) {
proxy_pass http://jsonapp/
break;
}
proxy_pass http://otherstuff/
答案3
我将反对其他人的建议。
我认为依赖 HTTP 服务器对 JSON API 进行版本控制是一个非常糟糕的主意。HTTP 服务器对您正在开发的 API 一无所知。这就像在文本文件中定义 Linux 版本,而不是将其构建到内核源代码中。这会使升级变得更加复杂。
它所需要的只是一个错误的配置,而对于下一个不知道复杂设置的人来说,一切可能都会失败。
在不知道自己在做什么的情况下,一定有一种方法可以使用脚本语言获得它(您使用的是脚本语言还是自定义 JSON 响应程序?)。例如,像 javascript 中可用的全局变量。或者在请求时返回它,JSON 请求以获取 API 版本。或者始终在响应的前面发送它。毕竟,它只是很少的文本。
使用 KISS 方法,您不会后悔。