Руководство по UriComponentsBuilder весной
1. Вступление
В этом руководстве мы сосредоточимся на SpringUriComponentsBuilder.. Более конкретно, мы опишем различные практические примеры реализации.
Конструктор работает вместе с классомUriComponents - неизменяемым контейнером для компонентов URI.
Новый классUriComponentsBuilder помогает создавать экземплярыUriComponents, обеспечивая детальный контроль над всеми аспектами подготовки URI, включая построение, расширение из переменных шаблона и кодирование.
2. Maven Зависимости
Чтобы использовать построитель, нам нужно включить следующий раздел вdependencies нашегоpom.xml:
org.springframework
spring-web
5.1.0.RELEASE
Последнюю версию можно найтиhere.
Эта зависимость распространяется только на Spring Web, поэтому не забудьте добавитьspring-context для полноценного веб-приложения.
Конечно, нам также необходимо настроить ведение журнала для проекта - подробнее об этомhere.
3. Случаи применения
Существует множество практических вариантов использованияUriComponentsBuilder, начиная с контекстного кодирования символов, не разрешенных в соответствующем компоненте URI, заканчивая динамической заменой частей URL-адреса.
Одним из самых больших преимуществUriComponentsBuilder является то, чтоwe can inject it right into a controller method:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity createCustomer(UriComponentsBuilder builder) {
// implementation
}
Давайте начнем описывать полезные примеры один за другим. Мы воспользуемся фреймворком JUnit для немедленного тестирования наших реализаций.
3.1. Создание URI
Начнем с самого простого. Мы хотим использоватьUriComponentsBuilder просто для создания простой ссылки:
@Test
public void constructUri() {
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.scheme("http").host("www.example.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.example.com").path("/junit 5").build().encode();
assertEquals("/junit%205", uriComponents.toUriString());
}
Разница в этом примере заключается в том, что мы хотим добавить пробел между словомjunit и числом5. СогласноRFC 3986, это было бы невозможно. Нам нужно закодировать ссылку, чтобы получить правильный результат, используя методencode().
3.3. Создание URI из шаблона
Шаблоны URI разрешены в большинстве компонентов URI, но их значение ограничено конкретным элементом, который мы указываем как шаблон. Давайте посмотрим на пример, чтобы прояснить:
@Test
public void constructUriFromTemplate() {
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.scheme("http").host("www.example.com").path("/{article-name}")
.buildAndExpand("junit-5");
assertEquals("/junit-5", uriComponents.toUriString());
}
Разница в этом примере заключается в том, как мы объявляем путь и как мы строим окончательный URI. Шаблон, который будет заменен ключевыми словами, обозначен скобками -\{…}, внутри методаpath(). Ключевое слово, которое используется для генерации последней ссылки, используется в методе с именемbuildAndExpand(…).
Обратите внимание, что может быть заменено несколько ключевых слов. Кроме того, путь к URI может быть относительным.
Этот пример будет очень полезен, когда мы захотим передать объекты модели в Spring Controller, на основе которого мы создадим URI.
3.4. Создание URI с параметрами запроса
Другой очень полезный случай - создание URI с параметрами запроса.
Нам нужно использоватьquery() изUriComponentsBuilder, чтобы указать параметры запроса URI. Давайте посмотрим на следующий пример:
@Test
public void constructUriWithQueryParameter() {
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.scheme("http").host("www.google.com")
.path("/").query("q={keyword}").buildAndExpand("example");
assertEquals("http://www.google.com/?q=example", uriComponents.toUriString());
}
Запрос будет добавлен в основную часть ссылки. Мы можем предоставить несколько параметров запроса, используя скобки\{…}.. Они будут заменены ключевыми словами в методе с именемbuildAndExpand(…).
Эту реализациюUriComponentsBuilder можно использовать, например, для создания языка запросов для REST API.
3.5. Расширение URI с помощью регулярных выражений
Последний пример показывает конструкцию URI с проверкой регулярных выражений. Мы сможем раскрытьuriComponents, только если проверка регулярного выражения будет успешной:
@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.
Кроме того, мы используемsingletonMap, чтобы заменить ключевое словоname на значениеtest.
Этот пример особенно полезен, когда мы позволяем пользователю указывать ссылки динамически, но мы хотим обеспечить своего рода безопасность, при которой в нашем веб-приложении работают только действительные ссылки.
4. Заключение
В этом руководстве представлены полезные примерыUriComponentsBuilder.
Основными преимуществамиUriComponentsBuilder являются гибкость использования переменных шаблона URI и возможность внедрения их непосредственно в методы Spring Controller.
Все примеры и конфигурации доступны здесь наGitHub.