Можно ли направлять запросы в разные приложения через Content-Type?
Я разрабатываю JSON API, и я хотел бы создать версию API с использованием какого-либо согласования контента. В настоящее время я планирую использовать Vendor MIME Types для этого.
Хотя я определенно могу сделать это на уровне приложений, я думаю, что было бы лучше, чтобы это происходило на уровне HTTP-сервера. Это возможно с Apache или nginx?
Тип контента будет выглядеть примерно так: application/vnd.vendorname-v1+json
или возможно используя параметры: application/vnd.vendorname+json;v=1
3 ответа
Идиоматический подход 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 оценивает переменные карты лениво, только один раз (для каждого запроса) и при их использовании.
Конечно; апача mod_rewrite
может сделать это с небольшим RewriteCond
хотя я немного ржавый, чтобы привести пример с макушки головы. Однако в nginx это выглядело бы примерно так (при условии, что вы определили два восходящих потока: один для вашего jsonapp, а другой для... otherstuff):
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 в начале ответа. Это очень мало текста в конце концов.
Используйте подход KISS, и вы не пожалеете об этом.