2010-05-27 174 views
7

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

当我做HttpGet(url),我得到,我有一个非法的字符(即{和})。如果我在此之前对网址进行编码,则不会出现任何错误,但请求会转到不存在任何内容的其他网址。

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

+0

您是否尝试过使用%7B和%7D,如下所示:domain.com/service/%7Busername%7D。或者就是你编码的意思。 – sblundy 2010-05-27 17:47:23

回答

9

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

具体做法是:

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

嗯。正如我在问题中所说的那样,我尝试过编码(确切的说就像你的那样),但它不起作用。我现在重试,成功!谢谢。 – 2010-05-27 17:54:22

+0

我第一次尝试它并失败是因为连接超时过期。 – 2010-05-27 18:45:30

1

这个问题是旧的,但它帮助我,我只是想补充的人谁可能来通过我固定在我的应用程序这一问题的变化迈克的回复。

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

我发现编码只是相关的部分工作,其中试图编码整个url导致我的错误。

1

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

这里这个函数只对你的URL的最后部分进行编码,该部分是{用户名}或文件名或任何可能具有非法字符的内容。

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; 
}