在Java中使用查询字符串中的:创建URI

在Java中使用查询字符串中的:创建URI,java,uri,Java,Uri,我试图用Java创建一个URI,其中我的查询字符串中有一个:。但是,无论我如何尝试创建URI,都会得到无效的响应 newURI(“http”,“localhost:1181”,“stream.mjpg”,“part1:part2”,null).toString()给了我 http://localhost:1181/stream.mjpg?part1:part2,不转义查询字符串中的: 如果我在创建URI之前转义查询字符串,它将转义%3A中的%,给出%253A,这是不正确的 newURI(“htt

我试图用Java创建一个URI,其中我的查询字符串中有一个
。但是,无论我如何尝试创建URI,都会得到无效的响应

newURI(“http”,“localhost:1181”,“stream.mjpg”,“part1:part2”,null).toString()给了我
http://localhost:1181/stream.mjpg?part1:part2
,不转义查询字符串中的

如果我在创建URI之前转义查询字符串,它将转义
%3A
中的
%
,给出
%253A
,这是不正确的

newURI(“http”,“localhost:1181”,“stream.mjpg”,“part1%3Apart2”,null).toString()给出<代码>
http://localhost:1181/stream.mjpg?part1%253Apart2


我的结果需要是
http://localhost:1181/stream.mjpg?part1%3Apart2
因为我的服务器要求在查询字符串中编码
`


我是否遗漏了什么,或者我将不得不手动创建查询字符串?

这并不漂亮,但您可以仅在查询部分使用URLEncoder:

String query = URLEncoder.encode("part1:part2", StandardCharsets.UTF_8);
// Required by server.
query = query.replace("+", "%20");

String uri =
    new URI("http", "localhost:1181", "/stream.mjpg", null, null)
    + "?" + query;

对我来说,正确的打印方式是“”。使用Java.net包中的Java 8和URI。请问您使用的是什么版本的java和包?这是不正确的。我需要我的结果是
http://localhost:1181/stream.mjpg?part1%3Apart2
。我编辑了我的帖子来添加这个,因为我意识到我忘记了它。“因为我的服务器要求在查询字符串中编码
”你能分享你正在使用的服务器吗?好吧,URI不需要在查询部分编码
,因为它在URI的那个部分或以后的部分中不表示任何元字符。解决方法是在不使用查询的情况下创建URI,将其转换为字符串,然后手动添加编码键和值。@PariNgang
在URI中保留,但不是在其所有部分中保留。在
scheme://user:password@服务器的地址:端口
,但此后它不再是特殊的,因此
/path
可以包含它,与
?query=val
#fragment
相同,这就是URI构造函数不编码它的原因。