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 进行编码,因此我可以看到两个选项
完全忽略 baseUrl
方法并将完全限定的 URL 传递给 uri
方法,这将覆盖 baseUrl
方法。
WebClient.builder()
.build()
.uri(URI.create( "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME"))
.get().exchange();
创建您自己的自定义 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();
我需要在 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 进行编码,因此我可以看到两个选项
完全忽略
baseUrl
方法并将完全限定的 URL 传递给uri
方法,这将覆盖baseUrl
方法。WebClient.builder() .build() .uri(URI.create( "https://RABBIT_HOSTNAME/api/queues/%2F/QUEUE_NAME")) .get().exchange();
创建您自己的自定义 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();