Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用webflux webclient发出请求时,如何正确编码加号(+;)?_Java_Spring_Spring Webflux - Fatal编程技术网

Java 使用webflux webclient发出请求时,如何正确编码加号(+;)?

Java 使用webflux webclient发出请求时,如何正确编码加号(+;)?,java,spring,spring-webflux,Java,Spring,Spring Webflux,我正在尝试使用spring Webflux Webclient发送一个国际格式的电话号码,并通过另一个同样使用Webflux的应用程序读取此电话号码 我的代码如下所示: webClient = WebClient.builder() .baseUrl(baseUrl) .build(); return webClient .get() .uri(uriBuilder -> uriBuilder

我正在尝试使用spring Webflux Webclient发送一个国际格式的电话号码,并通过另一个同样使用Webflux的应用程序读取此电话号码

我的代码如下所示:

webClient = WebClient.builder()
            .baseUrl(baseUrl)
            .build();

return webClient
            .get()
            .uri(uriBuilder -> uriBuilder
                    .path("/endpoint")
                    .queryParam("phone-number", "+33612345678")
                    .build()
            )
            .retrieve()
            .bodyToMono(String.class);
.queryParam("phone-number", UriUtils.encode("+34612345678", StandardCharsets.UTF_8))
不幸的是,在这个呼叫和接收器之间的某个地方,加号被一个空格取代。 端点将“33612345678”作为字符串接收

请求的netty调试日志显示:

+--------+-------------------------------------------------+----------------+
|00000000| 47 45 54 20 2f 63 75 73 74 6f 6d 65 72 73 3f 70 |GET  /endpoint?p|
|00000010| 68 6f 6e 65 2d 6e 75 6d 62 65 72 3d 2b 33 33 36 |hone-number=+336|
|00000020| 31 32 33 34 35 36 37 38 26 6f 6e 6c 79 2d 72 65 |12345678
我试着自己把电话号码编码成这样:

webClient = WebClient.builder()
            .baseUrl(baseUrl)
            .build();

return webClient
            .get()
            .uri(uriBuilder -> uriBuilder
                    .path("/endpoint")
                    .queryParam("phone-number", "+33612345678")
                    .build()
            )
            .retrieve()
            .bodyToMono(String.class);
.queryParam("phone-number", UriUtils.encode("+34612345678", StandardCharsets.UTF_8))
内蒂的日志显示:

+--------+-------------------------------------------------+----------------+
|00000000| 47 45 54 20 2f 63 75 73 74 6f 6d 65 72 73 3f 70 |GET  /endpoint?p|
|00000010| 68 6f 6e 65 2d 6e 75 6d 62 65 72 3d 25 32 35 32 |hone-number=%252|
|00000020| 42 33 34 36 31 32 33 34 35 36 37 38 20 48 54 54 |B34612345678 HTT|
电话号码似乎已被编码两次

+->%2B->%252B

加号已由UriUtils进行编码。编码然后uriBuilder已对%进行编码

我找到的唯一方法是禁用UriBuilder的编码:

 DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
    factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
    this.webClient = WebClient.builder()
            .baseUrl(baseUrl)
            .uriBuilderFactory(factory)
            .build();
还有我的自定义编码
UriUtils.encode(“+34612345678”,StandardCharsets.UTF_8)

在这种情况下,netty的日志看起来像预期的:

+--------+-------------------------------------------------+----------------+
|00000000| 47 45 54 20 2f 63 75 73 74 6f 6d 65 72 73 3f 70 |GET  /endpoint?p|
|00000010| 68 6f 6e 65 2d 6e 75 6d 62 65 72 3d 25 32 42 33 |hone-number=%2B3|
|00000020| 34 36 31 32 33 34 35 36 37 38 20 48 54 54 50 2f |4612345678 HTTP/|
当然,接收电话号码的端点会得到:“+33612345678”

总之,看起来UriBuilder正在对某些符号进行编码,如“%”,但没有对“+”符号进行编码。
Spring参考资料:

我也遇到了同样的问题,但从中找到了解决办法

这应该适合您:

返回网络客户端
.get()
.uri(uriBuilder->UriComponentsBuilder.fromUri(uriBuilder.build())
.path(“/endpoint”)
.queryParam(“电话号码”,“{phone number}”)
.encode()
.buildAndExpand(“+33612345678”)
.toUri()
)
.retrieve()
.bodyToMono(String.class);

这是正确的,加号没有按照RFC 3986进行编码,
queryparam
的spring文档中提到了加号,您可以使用模板强制执行更严格的编码谢谢您将我指向
queryparam
文档。我试图实施更严格的编码,但我不明白。它表示
TEMPLATE_和_值
:使用
UriComponentsBuilder#encode()
,并且
UriComponentsBuilder#encode():首先预编码
URI模板,然后在展开时严格编码URI变量。例如“;”字符:第一个选项将URI变量中的“;”替换为“%3B”。这就是我通过强制执行
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.TEMPLATE_和_值)所做的但它不编码“;”或“+”仅使用
值进行尝试
编码我尝试了所有编码,但没有一个编码;或+符号:(感谢您的回答。不幸的是,我无法测试它,因为我们完全从项目中删除了SpringWebFlux!我将把它标记为正确答案,直到有人证明我错了:)