Я разрабатываю 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. подход, и вы не пожалеете об этом.