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

JAVA herman 332浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:codedq,之前的微信号好友位已满,备注:返现
饿了么大量招人,我内推!Java 方向!薪资不设上限,工作年龄不限!工作地点限魔都,可电话面试!简历,发我微信:codedq
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

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 链接处理,如果有不懂的可以加微信交流!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:xttblog(5000人已满),微信号3:codedq(超3800)。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » WebFlux中UriBuilder和UriComponents处理uri链接编解码