javax UriBuilder无法正确转义“}”

h4cxqtbf  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(142)

javax.ws.rs.core.UriBuilder无法正确转义}

import javax.ws.rs.core.UriBuilder;
public void test() {
    final UriBuilder builder = UriBuilder.fromUri("http://host");
    builder.path("dir}one");
    l.info(builder.toString());
}

将输出http://host/dir}one,留下未转义的}
org.apache.http.client.utils.URIBuilder

org.apache.http.client.utils.URIBuilder;
public void testApache() {
    final URIBuilder builder = new URIBuilder(URI.create("http://host"));
    builder.setPath("dir}one");
    l.info(builder.toString());
}

将输出http://hostdir%7Done,按预期使用%7D转义}
这是javax.ws.rs.core.UriBuilder中的bug吗?

z2acfund

z2acfund1#

根据RFC 3986,字符**}不是保留字符,因此不需要转义。它可以用%7D**转义,但这不是必需的。
因此,两个UriBuilder实现都正确运行。

0yg35tkg

0yg35tkg2#

实际上,如果不转义大括号,RestEasy(包含UriBuilder的实现)将抛出由java.net.URISyntaxException: Illegal character in query at index引起的jakarta.ws.rs.core.UriBuilderException: RESTEASY003330: Failed to create URI。但是,我不确定它是否可以在jakarta.​ws.​rs.​core.UriBuilder中修复,因为它是一个支持模板的构建器,它使用花括号来分隔模板。因此,在我看来,这取决于调用者指出一些花括号不用于构建模板,以便RestEasy(或Jersey)不会试图将花括号之间的字符串解释为模板,并避免将未编码的花括号发送到java.base/java.net.URI$Parser.checkChars(),无论RFC如何说,java.base/java.net.URI$Parser.checkChars()肯定会拒绝它们。
就我个人而言,我只是这样做:

final String encoded = unencoded.replace("{", "%7B").replace("}", "%7D");

请记住,您可以通过不明智地使用这种肮脏的组合来破坏模板管理。
P.S:RestEasy的文档似乎证实了我的发现。

相关问题