UriComponentsBuilder 实现了 UriBuilder。你可以反过来用 UriBuilderFactory 创建一个 UriBuilder。UriBuilderFactory 和 UriBuilder 一起提供了一个可插拔的机制,根据共享配置,如基本 URL、编码偏好和其他细节,从 URI 模板中构建 URI。
你可以用 UriBuilderFactory 配置 RestTemplate 和 WebClient,以定制 URI 的准备。DefaultUriBuilderFactory 是 UriBuilderFactory 的默认实现,它在内部使用 UriComponentsBuilder,并公开共享配置选项。
下面的例子显示了如何配置一个 RestTemplate:
// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;
String baseUrl = "https://example.org";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
// 编码模式:先对 URI 模板进行预编码,然后在展开时对 URI 变量进行严格编码
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.TEMPLATE_AND_VALUES);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(factory);
下面的例子配置了一个 WebClient:
// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;
String baseUrl = "https://example.org";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
WebClient client = WebClient.builder().uriBuilderFactory(factory).build();
此外,你也可以直接使用 DefaultUriBuilderFactory。它类似于使用 UriComponentsBuilder,但是,它不是静态的工厂方法,而是一个实际的实例,持有配置和偏好,如下例所示:
String baseUrl = "https://example.com";
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);
URI uri = uriBuilderFactory.uriString("/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123");
// https://example.com/hotels/Westin?q=123