Путеводитель по UriComponentsBuilder весной
1. Введение
В этом учебнике мы сосредоточимся на весенней UriComponentsBuilder. В частности, мы опишем различные практические примеры реализации.
Строитель работает совместно с УриКомпоненты класс – непреложный контейнер для компонентов URI.
Новая UriComponentsBuilder класс помогает создавать УриКомпоненты путем обеспечения мелкозернистого контроля над всеми аспектами подготовки URI, включая строительство, расширение от переменных шаблонов и кодирование.
2. Мейвен зависимостей
Для того, чтобы использовать строитель, мы должны включить следующий раздел в зависимостей нашего пом.xml :
org.springframework spring-web 5.2.2.RELEASE
Последнюю версию можно найти здесь .
Эта зависимость охватывает только Spring Web, так что не забудьте добавить весенне-контекстный для полного веб-приложения.
Мы, конечно, также необходимо создать лесозаготовки для проекта – подробнее об этом здесь .
3. Использование случаев
Есть много практических случаев использования для UriComponentsBuilder , начиная с контекстуального кодирования символов, не разрешенных в соответствующем компоненте URI, заканчивая динамической заменой частей URL.
Одно из самых больших преимуществ UriComponentsBuilder является то, мы можем ввести его прямо в метод контроллера :
@RequestMapping(method = RequestMethod.POST) public ResponseEntity createCustomer(UriComponentsBuilder builder) { // implementation }
Начнем описывать полезные примеры один за другим. Мы будем использовать фреймворка JUnit для немедленной проверки наших реализаций.
3.1. Строительство УРИ
Начнем с самого простого. Мы хотим использовать UriComponentsBuilder просто для создания простой ссылки:
@Test public void constructUri() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/junit-5").build(); assertEquals("/junit-5", uriComponents.toUriString()); }
Как мы можем наблюдать, мы создали новый экземпляр UriComponentsBuilder , затем мы предоставили тип схемы, хост и путь к месту назначения запроса.
Этот простой пример может быть полезен, когда мы хотим выполнить перенаправление на другую часть/ссылку нашего сайта.
3.2. Строительство закодированного URI
В дополнение к созданию простой ссылки, мы можем захотеть кодировать конечный результат. Давайте посмотрим на практике:
@Test public void constructUriEncoded() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/junit 5").build().encode(); assertEquals("/junit%205", uriComponents.toUriString()); }
Разница в этом примере заключается в том, что мы хотим добавить пространство между словом Джунит и число 5 . Соответственно к RFC 3986 , это было бы невозможно. Мы должны кодировать ссылку для достижения действительного результата, используя кодировать () метод.
3.3. Строительство URI из шаблона
Шаблоны URI разрешены в большинстве компонентов URI, но их значение ограничено определенным элементом, который мы указываем в качестве шаблона. Давайте посмотрим пример, чтобы прояснить:
@Test public void constructUriFromTemplate() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/{article-name}") .buildAndExpand("junit-5"); assertEquals("/junit-5", uriComponents.toUriString()); }
Разница в этом примере заключается в том, как мы объявляем путь и как мы строим окончательный URI. Шаблон, который будет заменен ключевыми словами, указан скобками – {…}, внутри путь () метод. Ключевое слово, используемое для создания конечной ссылки, используется в методе, названном buildAndExpand (…) .
Пожалуйста, обратите внимание, что может быть несколько ключевых слов, которые будут заменены. Кроме того, путь к URI может быть относительным.
Этот пример будет очень полезен, если мы хотим передать объекты модели контроллеру Spring, на основе которого мы построим URI.
3.4. Построение URI с параметрами запроса
Другим очень полезным случаем является создание URI с параметрами запроса.
Мы должны использовать запрос () из UriComponentsBuilder указать параметры запроса URI. Рассмотрим следующий пример:
@Test public void constructUriWithQueryParameter() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.google.com") .path("/").query("q={keyword}").buildAndExpand("baeldung"); assertEquals("http://www.google.com/?q=baeldung", uriComponents.toUriString()); }
Запрос будет добавлен в основную часть ссылки. Мы можем предоставить несколько параметров запроса, используя {…}. Они будут заменены ключевыми словами в методе, названном buildAndExpand (…) .
Эта реализация UriComponentsBuilder может использоваться для построения, например, языка запросов для API REST.
3.5. Расширение URI с регулярными выражениями
Последним примером является отображение конструкции URI с проверкой regex. Мы сможем расширить uriComponents только в том случае, если проверка regex будет успешной:
@Test public void expandWithRegexVar() { String template = "/myurl/{name:[a-z]{1,5}}/show"; UriComponents uriComponents = UriComponentsBuilder.fromUriString(template) .build(); uriComponents = uriComponents.expand(Collections.singletonMap("name", "test")); assertEquals("/myurl/test/show", uriComponents.getPath()); }
В вышеупомянутом примере мы видим, что в средней части ссылки должны быть только буквы из a-z и длина в диапазоне между 1-5 .
Кроме того, мы используем синглтонМэп , чтобы заменить ключевые имя с значением тестовый .
Этот пример особенно полезен, когда мы позволяем пользователю динамически указывать ссылки, но мы хотим обеспечить своего рода безопасность, где в нашем веб-приложении работают только действительные ссылки.
4. Заключение
В этом учебнике представлены полезные примеры UriComponentsBuilder .
Основные преимущества UriComponentsBuilder гибкость использования переменных шаблонов URI и возможность введения их непосредственно в методы весеннего контроллера.
Все примеры и конфигурации доступны здесь, на GitHub .