Java Spring中的WebClient在我不希望的时候替换了'%'字符

vql8enpb  于 2023-09-29  发布在  Spring
关注(0)|答案(1)|浏览(110)

我正在尝试创建一个包含“#”的URI。我知道这需要被替换为“%23”,所以我这样做了。但是,当使用WebClient连接到端点时,它会自动将“%”替换为“%25”,因此我最终使用“%2523”。
我试着只留下'#'字符,以为它会用编码格式替换所有非法字符(我可能在这里使用了错误的术语),但它没有替换它。下面是我的一些想法,没有什么太复杂的。
UPDATE:tag是一个短字符串,包含一个“#”字符,每隔一个字符有效。在下面的例子中,tag是#8QQRVVL0。它不是URI片段,只是标识符系统的设计方式。

if(tag.contains("#")){
            tag = tag.replace("#", "%23");
        }
        UserStatistics user = new UserStatistics();
        String playersEndpoint = "players/";
        JSONObject json = webClient.get()
                .uri(playersEndpoint + tag)
                .retrieve()
                .bodyToMono(JSONObject.class)
                .block();

URI的其余部分是在示例化WebClient对象时创建的,在Class中是优先级。

bttbmeg0

bttbmeg01#

你可以试试这样的东西:

String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);

发生这种情况的原因是因为Java spring使用了所谓的百分比编码-这就是为什么%被转换为%25的原因,这里有更多信息:https://en.wikipedia.org/wiki/Percent-encoding
如果你能给予更多关于你在哪里和如何定义标签的细节,我可能会给出其他具体的建议。
更新:也许你可以试试这样的东西?

JSONObject json = webClient.get()
            .uri(playersEndpoint + UriUtils.encodePath(tag, "UTF-8")))
            .retrieve()
            .bodyToMono(JSONObject.class)
            .block();

跟进更新:
尝试使用%2F更新playersEndpoint的/内部?

相关问题