Как диспетчеризация контролируется в JAX-RS?

Я пишу RESTful веб-сервис с RESTeasy. Это реализация JAX-RS. Вы аннотируете класс или метод одной аннотацией @Path. Регулярные выражения используются для получения параметров пути. Например

@Path("/foo{varname:.*}/bar")

соответствует всем шаблонам, начинающимся с "/foo", заканчивающимся на "/bar" и имеющим что-либо между ними. Все, что находится между ними, присваивается параметру с именем varname.

Некоторые фреймворки (например, Django) имеют список регулярных выражений и методов, которые будут опробованы по порядку. Например, /john/ q / smith, /john/ndom.*‹/smith, /john/ оформления. "/ john / henry / smith" соответствует второму и третьему, но второе будет отправлено, потому что это первое найденное совпадение.

Это возможно в JAX-RS, или нет никакого внутреннего порядка для классов и методов? Для /john/ndom.*‹/ndom.*} вам нужно написать регулярное выражение, которое означает / john / every thing / every thingbutsmith? Вам придется менять его каждый раз, когда вы меняете другие.

1 ответ

Существует четко определенный алгоритм, его описывает раздел 3.7.1 спецификации JAX-RS. Честно говоря, я нахожу объяснение довольно непрозрачным - поэтому, читая его, я не могу ответить на ваш вопрос.

Однако я только что нашел обзор CXF алгоритма выбора, и это, кажется, указывает на то, что правила приоритета действительно позволяют вам делать то, что вы хотите.

Правила приоритета

В JAX-RSСпецификация определила строгие правила сортировки и приоритета для сопоставления выражений URI и основана на наиболее конкретном алгоритме сопоставления. ВJAX-RS провайдер собирает набор развернутых выражений URI и сортирует их на основе следующей логики:

  1. Первичный ключ сортировки - это количество буквальных символов в полном шаблоне соответствия URI. Сортировка в порядке убывания. В нашем неоднозначном примере шаблон getCustomer() содержит 11 буквальных символов: /customers/. В шаблоне метода getAd dress() есть 18 буквальных символов: /customers/ plus address. Следовательно, провайдер JAX-RS будет пытаться сопоставить шаблон getAddress() перед getCustomer().

  2. Вторичный ключ сортировки - это количество выражений шаблона, встроенных в шаблон, то есть {id} или {id: .+}. Сортировка в порядке убывания. 3. Третичный ключ сортировки - это количество выражений шаблона не по умолчанию. Выражение шаблона по умолчанию - это выражение, которое не определяет регулярное выражение, то есть {id}.

Другие вопросы по тегам