UriComponentsBuilder 实现了 UriBuilder。你可以反过来用 UriBuilderFactory 创建一个 UriBuilder。UriBuilderFactory 和 UriBuilder 一起提供了一个可插拔的机制,根据共享配置,如基本 URL、编码偏好和其他细节,从 URI 模板中构建 URI。

    你可以用 UriBuilderFactory 配置 RestTemplate 和 WebClient,以定制 URI 的准备。DefaultUriBuilderFactory 是 UriBuilderFactory 的默认实现,它在内部使用 UriComponentsBuilder,并公开共享配置选项。

    下面的例子显示了如何配置一个 RestTemplate:

    1. // import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;
    2. String baseUrl = "https://example.org";
    3. DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
    4. // 编码模式:先对 URI 模板进行预编码,然后在展开时对 URI 变量进行严格编码
    5. factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.TEMPLATE_AND_VALUES);
    6. RestTemplate restTemplate = new RestTemplate();
    7. restTemplate.setUriTemplateHandler(factory);

    下面的例子配置了一个 WebClient:

    1. // import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;
    2. String baseUrl = "https://example.org";
    3. DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
    4. factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
    5. WebClient client = WebClient.builder().uriBuilderFactory(factory).build();

    此外,你也可以直接使用 DefaultUriBuilderFactory。它类似于使用 UriComponentsBuilder,但是,它不是静态的工厂方法,而是一个实际的实例,持有配置和偏好,如下例所示:

    1. String baseUrl = "https://example.com";
    2. DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);
    3. URI uri = uriBuilderFactory.uriString("/hotels/{hotel}")
    4. .queryParam("q", "{q}")
    5. .build("Westin", "123");
    6. // https://example.com/hotels/Westin?q=123