Параметры пути REST конфликтуют с путем к ресурсу? - PullRequest
1 голос
/ 19 июня 2020

Этот вопрос возник, когда я создавал бэкэнд с использованием JAX-RS, но он действительно может применяться к любому REST API.

Как JAX-RS обрабатывает пути, которые могут конфликтовать из-за переменных пути param? Предположим, у вас есть

@POST
@Path('createBox/{boxName}')
foo()

@POST
@Path('createBox/small')
bar()

И кто-то хочет вызвать первую конечную точку с аргументом параметра пути small. Что происходит в этом случае? Если бы foo() и bar() имели разные пармы (например, @FormParam), помогло бы это различать? Что, если бы они были точно такими же, без аргументов? Является ли поведение недетерминированным c?

1 Ответ

1 голос
/ 19 июня 2020

Ссылка: RESTful Java с JAX-RS 2.0, 2-е издание Билл Берк

  1. "/customers/{id : .+} <- getCustomer </li>
  2. "/customers/{id : .+}/address" <- getAddress </li>

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

Спецификация JAX-RS определила строгие правила сортировки и приоритета для сопоставления выражений URI и основана на большинстве Speci c алгоритм побеждает совпадение.

  1. Первичный ключ сортировки - это количество буквальных символов в полном шаблоне сопоставления URI в порядке убывания (11 в getCustomer против 18 в getAddress)
  2. Вторичный ключ сортировки - это количество выражений шаблона, встроенных в шаблон, то есть {id} или {id : .+}. Эта сортировка выполняется в порядке убывания.
  3. Третичный ключ сортировки - это количество выражений шаблона не по умолчанию. Выражение шаблона по умолчанию - это выражение, которое не определяет регулярное выражение, то есть {id}

Ваш пример:

bar() выигрывает, потому что как согласно правилу 1 в нем больше буквальных символов

...