Назад | Перейти на главную страницу

Можно ли направлять запросы в разные приложения через Content-Type?

Я разрабатываю JSON API, и я хотел бы изменить версию API, используя какое-то согласование содержимого. В настоящее время я планирую использовать Типы MIME от поставщиков сделать это.

Хотя я определенно могу сделать это на уровне приложения, я думаю, что было бы лучше сделать это на уровне HTTP-сервера. Возможно ли это с Apache или nginx?

Content-Type будет выглядеть примерно так: application/vnd.vendorname-v1+json или, возможно, используя параметры: application/vnd.vendorname+json;v=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 вычисляет переменные карты лениво, только один раз (на запрос) и когда вы их используете.

Конечно; Apache's mod_rewrite мог бы сделать это с небольшим количеством RewriteCond, хотя я слишком ржавый, чтобы приводить вам пример из моей головы. Однако в nginx это выглядело бы примерно так (при условии, что у вас определены два восходящих потока; один для вашего jsonapp, а другой для ... прочего):

if ($content_type = application/vnd.vendorname-v1+json) {
    proxy_pass http://jsonapp/
    break;
}
proxy_pass http://otherstuff/

Я собираюсь пойти против того, что предлагали другие.

Я считаю, что полагаться на управление версиями JSON API с HTTP-сервера - это действительно плохая идея. HTTP-сервер ничего не знает о разрабатываемом вами API. Это похоже на определение версии Linux в текстовом файле вместо встраивания ее в исходный код ядра. Это усложняет обновление.

Все, что ему нужно, это неправильная конфигурация в будущем, и все это может обернуться для следующего парня, который не знает о сложной настройке.

Без особых знаний о том, что вы делаете, должен быть способ сделать это доступным с помощью вашего языка сценариев (вы используете язык сценариев или это пользовательский ответчик JSON?). т.е. как глобальная переменная, доступная в javascript. Или вернуть его по запросу, запрос JSON для получения версии API. Или всегда отправлять его во всех ответах JSON в начале ответа. В конце концов, это очень маленький текст.

Используйте K.I.S.S. подход, и вы не пожалеете об этом.