是否可以通过 Content-Type 将请求路由到不同的应用程序?

是否可以通过 Content-Type 将请求路由到不同的应用程序?

我正在设计一个 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在您serverlocation部分中使用:

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 方法,您不会后悔。

相关内容