Android HttpURLConnection和带有特殊字符的URL

时间:2011-12-06 04:05:26

标签: java android url httpurlconnection

考虑以下代码(从HTTP请求中检索响应并打印它)。注意:此代码适用于标准Java应用程序。在Android应用程序中使用代码时,我只会遇到下面列出的问题。

public class RetrieveHTMLTest {

public static void main(String [] args) {
    getListing(args[0);
}

public static void getListing(String stringURL) {

    HttpURLConnection conn = null;
    String html = "";
    String line = null;
    BufferedReader reader = null;
    URL url = null;

    try {
        url = new URL(stringURL);

        conn = (HttpURLConnection) url.openConnection();

        conn.setConnectTimeout(6000);
        conn.setReadTimeout(6000);
        conn.setRequestMethod("GET");

        reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        conn.connect();

        while ((line = reader.readLine()) != null) {
            html = html + line;
        }

        System.out.println(html);

        reader.close();
        conn.disconnect();
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {

    }
}   
}

如果我提供网址: 的http://,某/ somepath /

以下代码正常。但是,如果我将URL更改为: http:// somehost / somepath [评论] / 由于“[”和“]”字符,代码会抛出超时异常。

如果我将网址更改为: 的http://,某/ somepath%20%5Ba上%20comment%5D / 的 代码工作正常。同样,因为“[”和“]”字符不存在。

我的问题是,如何获取网址:

http:// somehost / somepath [a comment] /

采用以下格式:

的http://,某/ somepath%20%5Ba上%20comment%5D /

另外,我应该继续在Android中使用HttpURLConnection,因为它无法接受带有特殊字符的网址吗?如果标准在使用HttpURLConnection之前总是转换URL?

2 个答案:

答案 0 :(得分:13)

使用URLEncoder类:

URLEncoder.encode(value, "utf-8");

您可以找到更多详情here

编辑:您应该仅使用此方法对参数值进行编码。不要编码整个URL。例如,如果您有以下网址:http://www.somesite.com?param1=value1&param2=value2 那么你应该只对value1和value2进行编码,然后使用这些值的编码版本形成url。

答案 1 :(得分:2)

url = URLEncoder.encode(value, "utf-8");
url = url.replaceAll("\\+", "%20");

“+”可能无法恢复