Java - 新URL(...)不会转义第一个字符

时间:2018-03-06 17:59:42

标签: java url github url-parameters

我正在尝试创建一个链接,在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

第二个#正在被转义,但第一个不是,我不太明白为什么。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

简而言之,网址解析器会将您的第一个#视为一个片段(a.k.a。anchor,例如<a name="named-anchor">)。因为根据RFC-3986: Section 3,片段必须是最后的并且#是保留字符,在第一个#之后的任何内容被假定为该片段的一部分,导致解析器进一步编码&#34;无效&#34;字符,例如您的第二个#。来自RFC:

  

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

     

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

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

处理此问题的最佳方法是:

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