Webflux Webclient 在 URL 中转义斜杠

Mic*_* Dz 5 java spring spring-webflux spring-webclient

我需要在 URL 中包含一个斜杠来访问 RabbitMQ API,我正在尝试使用WebClient以下方法获取数据:

WebClient.builder()
     .baseUrl("https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME")
     .build()
     .get().exchange();
Run Code Online (Sandbox Code Playgroud)

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

我尝试了以下选项:

"\\/"- WebClient 更改为%5C但 Rabbit 无法正确解释并返回 404。

"%5C"- WebClient 更改为%255C,Rabbit 返回 404。

如何%2F使用 WebClient保留url?

123*_*123 7

默认情况下它总是对 URL 进行编码,所以我可以看到两个选项

  1. 完全忽略该baseUrl方法并将完全限定的 URL 传递到该uri方法中以覆盖该baseUrl方法。

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

    public class CustomUriBuilderFactory extends DefaultUriBuilderFactory {
    
        public CustomUriBuilderFactory(String baseUriTemplate) {
            super(UriComponentsBuilder.fromHttpUrl(baseUriTemplate));
            super.setEncodingMode(EncodingMode.NONE);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以使用uriBuilderFactory of baseUrl,这将允许你仍然使用 uri 来表示 uri 部分

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