Je dois inclure une barre oblique dans une URL pour accéder à l'API RabbitMQ et j'essaie de récupérer des données à l'aide de WebClient:

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

Lorsque je remplace / par %2F, je peux voir dans le descripteur de requête que %2F a été changé en %252F et à cause de cela, je ne trouve pas de réponse.

J'ai essayé les options suivantes:

"\\/" - WebClient passe à %5C mais Rabbit ne l'interprète pas correctement et renvoie 404. "%5C" - WebClient passe à %255C, Rabbit renvoie 404.

Comment puis-je conserver %2F dans une URL à l'aide de WebClient?

4
Michael Dz 17 avril 2020 à 15:16

2 réponses

Meilleure réponse

Par défaut, il encodera toujours l'URL, donc je peux voir deux options

  1. Ignorez complètement la méthode baseUrl et passez une URL complète dans la méthode uri qui remplacera la méthode baseUrl.

    WebClient.builder()
         .build()
         .uri(URI.create( "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME"))
         .get().exchange();
    
  2. Créez votre propre UriBuilderFactory personnalisée, mappez un Uri et définissez le codage sur NONE

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

    et ensuite vous pouvez utiliser uriBuilderFactory de baseUrl, ce qui vous permettra de toujours utiliser uri uniquement pour la partie uri

    WebClient.builder()
            .uriBuilderFactory(
                new CustomUriBuilderFactory(
                    "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME"
            ))
            .build()
            .get()
            .uri(whatever)
            .exchange();
    
4
123 18 avril 2020 à 09:47

Vous pouvez mettre en œuvre ceci:

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

Et:

WebClient.builder()
        .baseUrl("https://RABBIT_HOSTNAME/api/queues")
        .build()
        .post()
        .uri(uriBuilder -> uriBuilder.pathSegment(uri.getPath(), "QUEUE_NAME").build())...
1
V. Mokrecov 17 avril 2020 à 20:50