Android устарел модуль apache (HttpClient, HttpResponse и т.д.)

Android отказался от модуля Apache с уровня API 22, поэтому мой вопрос: как я могу использовать, например, HttpResponse из библиотеки Apache, а не из Android SDK? Проблема в том, что они одинаковы в обоих пакетах.

Но, например, HttpGet в порядке, потому что он вызвал HttpGetHC4 в Apache.

Ответ 1

Метод HttpClient устарел. Теперь вы можете использовать URLConnection, как вы можете видеть в этом примере:

private StringBuffer request(String urlString) {
    // TODO Auto-generated method stub

    StringBuffer chaine = new StringBuffer("");
    try{
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestProperty("User-Agent", "");
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.connect();

        InputStream inputStream = connection.getInputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = rd.readLine()) != null) {
            chaine.append(line);
        }
    }
    catch (IOException e) {
        // Writing exception to log
        e.printStackTrace();
    }
    return chaine;
}

Я надеюсь, что это поможет кому-то.

Ответ 2

Нет ничего плохого в использовании модулей Apache. Google просто сделал большой беспорядок, потому что они не смогли сделать успешную вилку. Интеграция Google и Apache контролировалась Джесси Уилсоном - он работал в Google, перепутал все, а затем создал свою собственную библиотеку (OkHttp) во время работы на площади. Это действительно уродливая история.

Я советую использовать устаревший JAR файл, потому что он содержит старую версию Apache-библиотек без улучшений и исправлений (это очень старый предварительный снимок BETA). Как вы можете видеть на официальной странице компонентов Apache, есть новая версия 4.4, совместимая со всеми версиями Android. Его просто нужно было переупаковать в другом пространстве имен, чтобы избежать столкновения со старой версией.

Вы просто можете добавить зависимость от Maven (или скачать релиз от GitHub):

dependencies {
    compile "cz.msebera.android:httpclient:4.4.1.2"
}

И затем замените org.apache.http на cz.msebera.android.httpclient, поэтому ваш импорт будет выглядеть следующим образом:

import cz.msebera.android.httpclient.Header;
import cz.msebera.android.httpclient.HttpHost;
import cz.msebera.android.httpclient.HttpResponse;

Да, вы можете продолжать использовать библиотеки Apache, не тратя время на переработку рабочего кода!

Что касается разницы между использованием компонентов Apache и HttpURLConnection, HttpURLConnection использует ответное кэширование... И все. Я не уверен, что вы действительно этого хотите, и вы всегда можете реализовать его самостоятельно.

Кстати, я пробовал альтернативы вроде HttpURLConnection - они даже не близки к мощности и простоте Apache.

Ответ 3

В Android Marshmallow (sdk 23) вы можете добавить:

useLibrary 'org.apache.http.legacy'

для сборки .gradle в разделе android {} в качестве обходного пути. Это кажется необходимым для некоторых из собственных GMS-библиотек Google!

Ответ 4

Если бы я был вами, я не использую HttpClient, потому что:

У Apache HTTP-клиента меньше ошибок на Eclair и Froyo. Это лучшее выбор для этих выпусков.

Для Gingerbread и лучше, HttpURLConnection - лучший выбор.

Ссылка

Используйте OKHttp или HttpUrlConnection. А также я рекомендую не использовать библиотеку Apache, потому что это может быть неэффективно для Android.

Ответ 5

Я думаю, вы могли бы использовать библиотеки Apache непосредственно в своем проекте, а не те, которые были отправлены с Android (вы можете получить больше контроля таким образом - и скомпилируйте с более старой версией SDK, если вам нужно).

В build.gradle добавьте эту строку:

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

Чтобы предотвратить предупреждения, добавьте также эти строки:

android {

     -- YOUR EXISTING LINES --

     packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }

}

Ответ 6

Добавьте это в зависимости от вашего приложения, а затем оно будет работать правильно:

dependencies {
...
  compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

Ответ 7

Если вы хотите использовать библиотеку httpclient, вы должны добавить некоторое описание в файл build.gradle. И кажется, что контент, добавленный в файл build.gradle, определяется целевой целевой проекцией Android для.

если он предназначен для API22 и старше, тогда следует добавить следующую строку в build.gradle

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

если он предназначен для API23 и более поздних версий, затем следует добавить следующую строку в build.gradle

dependencies {
    compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'
}

Вот ссылка ссылка

Ответ 8

Используйте openConnection().

Документация HttpClient предполагает, что.

Обратитесь к этому.