Руководство по UriComponentsBuilder весной

Руководство по 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.