URL 中的 Webflux Webclient 转义斜线

Webflux Webclient escape slash in URL

我需要在 URL 中包含一个斜杠才能访问 RabbitMQ API 并且我正在尝试使用 WebClient:

获取数据
WebClient.builder()
     .baseUrl("https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME")
     .build()
     .get().exchange();

当我用 %2F 替换 / 时,我可以在请求描述符中看到 %2F 已更改为 %252F,因此我没有找到响应。

我尝试了以下选项:

"\/" - WebClient 更改为 %5C 但 Rabbit 无法正确解释它并且 returns 404.

"%5C" - WebClient 更改为 %255C,兔子 returns 404.

如何使用 WebClient 在 url 中保持 %2F

你可以实现这个:

URI uri = URI.create("%2F");

并且:

WebClient.builder()
        .baseUrl("https://RABBIT_HOSTNAME/api/queues")
        .build()
        .post()
        .uri(uriBuilder -> uriBuilder.pathSegment(uri.getPath(), "QUEUE_NAME").build())...

默认情况下,它将始终对 URL 进行编码,因此我可以看到两个选项

  1. 完全忽略 baseUrl 方法并将完全限定的 URL 传递给 uri 方法,这将覆盖 baseUrl 方法。

    WebClient.builder()
         .build()
         .uri(URI.create( "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME"))
         .get().exchange();
    
  2. 创建您自己的自定义 UriBuilderFactory,映射一个 Uri,并将编码设置为 NONE

    public class CustomUriBuilderFactory extends DefaultUriBuilderFactory {
    
        public CustomUriBuilderFactory(String baseUriTemplate) {
            super(UriComponentsBuilder.fromHttpUrl(baseUriTemplate));
            super.setEncodingMode(EncodingMode.NONE);
        }
    }
    

    然后您可以使用 uriBuilderFactorybaseUrl,这将允许您仍然仅将 uri 用于 uri 部分

    WebClient.builder()
            .uriBuilderFactory(
                new CustomUriBuilderFactory(
                    "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME"
            ))
            .build()
            .get()
            .uri(whatever)
            .exchange();