【问题标题】:Escaping ampersands in URLs for HttpClient requests为 HttpClient 请求转义 URL 中的 & 符号
【发布时间】:2011-02-03 05:26:14
【问题描述】:

所以我有一些像这样使用 Jakarta HttpClient 的 Java 代码:

URI aURI = new URI( "http://host/index.php?title=" + title + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery());

问题是,如果title 包含任何与号 (&),它们会被视为参数分隔符,并且请求会变得混乱......如果我将它们替换为 URL 转义的等效 %26,那么就会得到由 getEscapedPathQuery() 双重转义到 %2526

我目前正在通过以后基本上修复损坏来解决这个问题:

URI aURI = new URI( "http://host/index.php?title=" + title.replace("&", "%26") + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery().replace("%2526", "%26"));

但是必须有更好的方法来做到这一点,对吧?请注意,标题可以包含任意数量的不可预测的 UTF-8 字符等,因此必须转义其他所有内容。

【问题讨论】:

标签: java http url escaping apache-commons-httpclient


【解决方案1】:

给你:

import java.net.URLEncoder;
...
...
URI aURI = new URI( "http://host/index.php?title=" + URLEncoder.encode(title,"UTF-8") + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getPathQuery());

查看java.net.URLEncoder了解更多信息。

【讨论】:

  • 抱歉,好像不行,我还是得到双编码的 %2526? URLEncoder 所做的只是用 %26 替换 &,这与我原来的替换操作相同。
  • 好的,我修正了我的答案。你不应该使用 .getEscapedPathQuery() 因为标题现在被 URLEncoder 转义了。
  • 对不起,当我写第一个回复时,我的大脑一片混乱——你是对的,只对参数进行编码就足够了,其余的保持不变。谢谢!
【解决方案2】:

使用URLEncoder 类。

HTML 表单编码的实用程序类。该类包含静态 将字符串转换为 application/x-www-form-urlencoded MIME 格式。了解更多信息 关于 HTML 表单编码,请查阅 HTML 规范。

【讨论】:

  • 读者应该知道,对 application/x-www-form-urlencoded 的编码与 URI 编码并不完全相同。许多逃逸是相同的,但不是全部。
【解决方案3】:

如果您不想转义,为什么要调用 getEscapedPathQuery() ?只需决定谁的责任并保持一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2019-06-26
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多