Uri 是比 Url 更大的一个集。在 webflux 中,由于独特的响应式编码方式存在,该如何更合理的处理 Uri 编解码呢?
为此,WebFlux 提供了两个强大的类。UriComponents 和 UriBuilder。
我们可以通过 UriComponentsBuilder 来构建 UriComponents,UriComponentsBuilder 是支持变量占位符的。举个例子如下所示:
UriComponents uriComponents = UriComponentsBuilder
.fromUriString("https://xttblog.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.build();
URI uri = uriComponents.expand("taoge", "xttblog").toUri();
- fromUriString 支持占位符
- queryParam 添加或替换查询参数
- encode 对 uri 进行编码
- build 构建 UriComponents
- expand 扩展变量
- toUri 获得 URI
上面代码中 build 和 expand 函数也可以合起来使用。
URI uri = UriComponentsBuilder
.fromUriString("https://xttblog.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.buildAndExpand("weixin", "codedq")
.toUri();
如果不需要编码 encode,expand 等操作,也可以直接构建。
URI uri = UriComponentsBuilder
.fromUriString("https://xttblog.com/hotels/{hotel}")
.queryParam("q", "{q}")
.build("weixin", "codedq");
如果仅仅是为了替换参数,它还可以更短、更简洁!
URI uri = UriComponentsBuilder
.fromUriString("https://xttblog.com/hotels/{hotel}?q={q}")
.build("weixin", "codedq");
UriBuilder 也是一个在 SpringMVC 和 WebFlux 中都被支持的类。
UriBuilder 提供了一种插件机制,可以配置 RestTemplate 和 WebClient 使用 UriBuilderFactory。DefaultUriBuilderFactory 是 UriBuilderFactory 使用 UriComponentsBuilder 的一些共享配置选项的默认实现。
DefaultUriBuilderFactory 配合 RestTemplate 可以进行以下使用:
String baseUrl = "https://xttblog.com";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(factory);
DefaultUriBuilderFactory 整合 WebClient 的用法也很简单,示例如下:
String baseUrl = "https://xttblog.com";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
WebClient client = WebClient.builder().uriBuilderFactory(factory).build();
我们也可以单独直接使用 DefaultUriBuilderFactory,它的用法和 UriComponentsBuilder 一样,但不是静态工厂方法。如以下示例所示:
String baseUrl = "https://xttblog.com";
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);
URI uri = uriBuilderFactory.uriString("/taoge/{hotel}")
.queryParam("q", "{q}")
.build("weixin", "codedq");
以上就是 Webflux 中的 url 链接处理,如果有不懂的可以加微信交流!
: » WebFlux中UriBuilder和UriComponents处理uri链接编解码
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/252219.html