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吗?
2条答案
按热度按时间z2acfund1#
根据RFC 3986,字符**}不是保留字符,因此不需要转义。它可以用%7D**转义,但这不是必需的。
因此,两个
UriBuilder
实现都正确运行。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()
肯定会拒绝它们。就我个人而言,我只是这样做:
请记住,您可以通过不明智地使用这种肮脏的组合来破坏模板管理。
P.S:RestEasy的文档似乎证实了我的发现。