9

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

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

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

4

3 回答 3

10

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

具体来说:

String safeUrl = URLEncoder.encode("domain.com/service/{username}", "UTF-8");
于 2010-05-27T17:46:31.223 回答
2

我们不应该将 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;
}
于 2015-11-06T15:17:50.907 回答
1

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

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

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

于 2013-03-27T22:51:28.390 回答