【问题标题】:Use HttpGet with illegal characters in the URL在 URL 中使用带有非法字符的 HttpGet
【发布时间】:2010-05-27 17:42:38
【问题描述】:

我正在尝试使用 DefaultHttpClientHttpGet 向 Web 服务发出请求。不幸的是,Web 服务 URL 包含非法字符,例如 {(例如:domain.com/service/{username})。很明显Web服务命名写得不好,但我不能改变它。

当我执行HttpGet(url) 时,我发现我的 url 中有一个非法字符(即 { 和 })。如果我在此之前对 URL 进行编码,则不会出现错误,但请求会转到没有任何内容的不同 URL。

该 url 虽然包含非法字符,但可以在浏览器中使用,但 HttpGet 实现不允许我使用它。我应该怎么做或改用什么来避免这个问题?

【问题讨论】:

  • 您是否尝试过使用 %7B 和 %7D,例如:domain.com/service/%7Busername%7D。或者这就是你所说的编码的意思。

标签: java http httpwebrequest httpclient http-get


【解决方案1】:

我们不应该将 URLEncoder.encode 用于 URL 的地址部分,因为它会错误地将您的 http://domain.com/{username} 更改为 http%3A%2F%2Fdomain.com%2{username} 并且您应该知道它将替换所有带“+”的空格,我最好用“%20”替换它们。

这里这个函数只对你的 URL 的最后一部分进行编码,即 {username} 或文件名或任何可能包含非法字符的内容。

String safeUrl(String inUrl)
{
    int fileInd = inUrl.lastIndexOf('/') + 1;
    String addr = inUrl.substring(0, fileInd);
    String fileName = inUrl.substring(fileInd);
    String outUrl=null;

    try {
        outUrl = addr + URLEncoder.encode(fileName, "UTF-8");
        outUrl = outUrl.replace("+", "%20");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return outUrl;
}

【讨论】:

    【解决方案2】:

    http://java.sun.com/javase/6/docs/api/java/net/URLEncoder.html

    具体来说:

    String safeUrl = URLEncoder.encode("domain.com/service/{username}", "UTF-8");
    

    【讨论】:

    • 嗯。正如我在问题中所说,我已经尝试过编码(与您的完全相同),但它没有用。我现在重试并成功!谢谢。
    • 第一次尝试失败是因为连接超时。
    【解决方案3】:

    这个问题很老,但它对我有帮助,我只是想为任何可能过来的人补充一下,我在我的应用程序上解决了这个问题,并采用了 Mike 的回复变体。

    String safeUrl = "domain.com/service/" + URLEncoder.encode("{username}", "UTF-8");
    

    我发现只对相关部分进行编码是有效的,但尝试对整个 url 进行编码会导致我出错。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多