Webflux Webclient escape sla sh в URL - PullRequest
       25

Webflux Webclient escape sla sh в URL

1 голос
/ 17 апреля 2020

Мне нужно включить sla sh в URL для доступа к RabbitMQ API, и я пытаюсь получить данные, используя WebClient:

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

Когда я заменяю / на %2F В дескрипторе запроса я вижу, что %2F был изменен на %252F, и из-за этого я получаю не найденный ответ.

Я пробовал следующие варианты:

"\\/" - WebClient изменяется на %5C, но Rabbit не интерпретирует его правильно и возвращает 404. "%5C" - WebClient меняет на %255C, Rabbit возвращает 404.

Как мне сохранить %2F в URL с использованием WebClient?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

По умолчанию он всегда будет кодировать 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);
        }
    }
    

    и затем вы можете использовать uriBuilderFactory из baseUrl, что позволит вам по-прежнему использовать URI только для части URI

    WebClient.builder()
            .uriBuilderFactory(
                new CustomUriBuilderFactory(
                    "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME"
            ))
            .build()
            .get()
            .uri(whatever)
            .exchange();
    
1 голос
/ 17 апреля 2020

Вы можете реализовать это:

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

И:

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