Android HttpURLCподключение и URL со специальными символами - PullRequest
5 голосов
/ 06 декабря 2011

Рассмотрим следующий код (который получает ответ от 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 {

    }
}   
}

Если я предоставлю URL: http://somehost/somepath/

Следующий код работает нормально. Но если я изменю URL на: http://somehost/somepath [комментарий] / Код генерирует исключение тайм-аута из-за символов «[» и «]».

Если я изменю URL-адрес на: http://somehost/somepath%20%5Ba%20comment%5D/ Код работает отлично. Опять же, потому что символы "[" и "]" отсутствуют.

У меня вопрос, как мне получить URL:

http://somehost/somepath [комментарий] /

в следующем формате:

http://somehost/somepath%20%5Ba%20comment%5D/

Кроме того, следует ли мне продолжать использовать HttpURLConnection в Android, поскольку он не может принимать URL со специальными символами? Если стандарт всегда конвертировать URL перед использованием HttpURLConnection?

Ответы [ 2 ]

13 голосов
/ 06 декабря 2011

Используйте класс URLEncoder:

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

Более подробную информацию можно найти здесь .

Редактировать: этот метод следует использовать только для кодирования вашего параметраценности.НЕ кодируйте весь URL.Например, если у вас есть URL-адрес, такой как: http://www.somesite.com? Param1 = value1¶m2 = value2 , вам следует только кодировать value1 и value2, а затем формировать URL-адрес, используя закодированные версии этих значений.

2 голосов
/ 06 декабря 2011
url = URLEncoder.encode(value, "utf-8");
url = url.replaceAll("\\+", "%20");

"+" не может быть восстановлен

...