WebFlux中UriBuilder和UriComponents处理uri链接编解码

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链接编解码

: » WebFlux中UriBuilder和UriComponents处理uri链接编解码

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/252219.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论