【问题标题】:Creating a URI in Java with a : in the query string在 Java 中使用 : 在查询字符串中创建 URI
【发布时间】:2019-03-03 22:40:45
【问题描述】:

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

new URI("http", "localhost:1181", "/stream.mjpg", "part1:part2", null).toString(); 给我 http://localhost:1181/stream.mjpg?part1:part2,查询字符串中的 : 没有被转义。

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

new URI("http", "localhost:1181", "/stream.mjpg", "part1%3Apart2", null).toString(); http://localhost:1181/stream.mjpg?part1%253Apart2

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

是我遗漏了什么,还是我必须手动创建查询字符串?

【问题讨论】:

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

标签: java uri


【解决方案1】:

它并不漂亮,但您可以只在查询部分使用 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;

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多