【问题标题】:Java - new URL(...) doesn't escape the first characterJava - new URL(...) 不会转义第一个字符
【发布时间】:2018-08-14 16:28:27
【问题描述】:

我正在尝试创建一个链接,打开 Github 上的 New issue 页面,用现有的问题知识填充它。

为此,我使用如下查询参数:

https://github.com/User/Repository/issues/new?title=Some text&body=More Text

这很好,但是我正在尝试使用 Markdown 格式化文档,并且在通过调用创建新的 URL 后所有符号都被转义

URL url = new URL("https://github.com/User/Repository/issues/new?title=Some text&body=# Header # Another header");

结果会是这样的:

https://github.com/User/Repository/issues/new?title=Some text&body=# Header %23 Another header

第二个# 被转义,但第一个没有,我不太明白为什么。

有什么想法吗?

【问题讨论】:

  • 我怀疑这是因为许多 url 使用一个 # 表示在 JavaScript 中评估的参数。

标签: java url github url-parameters


【解决方案1】:

简而言之,URL 解析器将您的第一个# 视为一个片段(又名anchor,例如<a name="named-anchor">)。由于根据RFC-3986: Section 3,该片段必须在最后,并且# 是保留字符,因此第一个# 之后的任何内容都被假定为该片段的一部分,从而导致解析器对任何进一步的“无效”字符进行编码,例如作为你的第二个#。来自 RFC:

通用 URI 语法由称为方案、权限、路径、查询和片段的组件的分层序列组成。

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

请注意,fragment 位于最后,并由 # 分隔。

处理这个问题的最佳方法是:

  1. encode the body query parameter 自己或
  2. 使用为您进行转义的 HTTP 客户端,例如RestTemplate 来自 Spring 或 Apache HttpComponents

【讨论】:

  • 问题是,我自己不做http请求,而是使用Desktop.browse,因为我希望浏览器打开。
  • 那么你想要(1)。在创建 URL 以传递给 Desktop.browse 的位置,请使用我的答案中链接中的答案在创建查询参数时对其进行编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2017-03-30
  • 2017-08-23
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多