HttpClient не імпортуватиме в Android Studio


359

У мене в Android Studio написаний простий клас:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

public class Whatever {
    public void headBangingAgainstTheWallExample () {
        HttpClient client = new DefaultHttpClient();
    }
}

і з цього я отримую таку помилку часу компіляції:

Cannot resolve symbol HttpClient

Не HttpClientвходить в Android Studio SDK? Навіть якщо це не так, я додав його до моєї Gradle build так:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'org.apache.httpcomponents:httpclient:4.5'
}

З або без останнього рядка компіляції помилка однакова. Що я пропускаю?


4
Спробуйте використовувати, AndroidHttpClientякщо можете. Заглушки HttpClient дійсно містяться всередині андроїдної банки, тому не потрібно буде чітко посилатися на неї. Зауважте, що андроїд-версія httpclient, ймовірно, 4.1.1. Спроба використовувати більш нову версію, окрім цього, як правило, вимагає неприємностей (читайте: не працює, тому що завантажувач програмного забезпечення завжди виграє).
dhke

Відповіді:


813

HttpClientбільше не підтримується в sdk 23. Вам доведеться використовувати URLConnectionабо поновлювати версію до sdk 22 ( compile 'com.android.support:appcompat-v7:22.2.0')

Якщо вам потрібен sdk 23, додайте це до свого gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

Ви також можете спробувати завантажити та включити банку HttpClient безпосередньо у свій проект або використовувати натомість OkHttp


3
Посилання на оголошення: developer.android.com/preview/…
15:15

20
У моєму випадку це нічого не робить. Як це?
андроїд розробник

2
useLibrary не може бути вирішена, коли я додаю її. Моя мета - 23, що мені не вистачає?
Бадр

1
android { useLibrary 'org.apache.http.legacy' } [коли ти додаєш це] [1] 'org.apache.http' android-studio все ще має поради: 'Не вдається вирішити символ' [2], це може зробити android-studio (з sdk23). хоча є підказки (Неможливо вирішити символ) [3], якщо ви додаєте jar, він не має підказок, може скласти, але !!! не може працювати, тому що має дві копії 'org.apache.http'
YETI

1
Для всіх, хто там користується Volleyбібліотекою, зверніть увагу, що це додаток до рядка gradle має містити файл Gradle для бібліотеки, а не ваш додаток. Працює чудово! Дякую тонну!
sravan953

162

HttpClient був застарілий у рівні API 22 та видалений у рівні API 23. Ви все ще можете використовувати його в API рівня 23 і далі, якщо потрібно, проте найкраще перейти до підтримуваних методів обробки HTTP. Отже, якщо ви компілюєте 23, додайте це до свого build.gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

4
android { useLibrary 'org.apache.http.legacy' } [коли ти додаєш це] [1] 'org.apache.http' android-studio все ще має поради: 'Не вдається вирішити символ' [2], це може зробити android-studio (з sdk23). хоч є підказки (Неможливо вирішити символ) [3], якщо ти додаєш jar, він не має підказок, може скласти, але !!! не може працювати, тому що у нього є дві копії 'org.apache.http'
YETI

1
[2.1] Тож закрийте Android Studio і запускайте його заново, не відкривайте файли (файли), які використовують застарілий код, і "поради" не застосовуватимуться. Якщо вам потрібно відкрити файл, то він пропонує вам володіти кодом, тому [4] вам слід припинити використовувати HttpClient у контрольованому вами коді.
страя

Не знаю, чому (build-tool & sdk) 23 поводиться так дивно. Розробник підтримки, який не підтримує події, використовує "apche http" на увазі.
YETI

1
Вам слід оновити андроїд-студію до останньої версії, щоб уникнути такої поведінки ...... її виправлено у новій версії
rawcoder064

Які "підтримувані методи обробки HTTP"?
вальджіст

59

Відповідь TejaDroid у нижченаведеному посиланні допомогла мені. Неможливо імпортувати org.apache.http.HttpResponse в Android Studio

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.0.1'

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

дякую, це єдине рішення, яке працювало з новими епірементальними побудовами, оскільки useBibrary не впізнано в ньому
pt123

Це насправді краща відповідь, ніж наведена вище! він працює з новішими версіями компілятора
Matan Dahan

48

Щоб використовувати HTTP Apache для SDK рівня 23:

Верхній рівень build.gradle - /build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0' 
        // Lowest version for useLibrary is 1.3.0
        // Android Studio will notify you about the latest stable version
        // See all versions: http://jcenter.bintray.com/com/android/tools/build/gradle/
    }
    ...
}

Повідомлення від Android студії про оновлення gradle:

Повідомлення від Android студії про оновлення gradle

Модуль специфічний build.gradle - /app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

31

Спробуйте це спрацювало для мене. Додати цю залежність у файл build.gradle

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

16

1- завантажити файли jar-файлів Apache (станом на цю відповідь) 4.5.zip-файл з:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2 - відкрийте поштову копію файлів з банку в папку libs. Ви можете знайти його, якщо перейти до верхньої частини проекту, де написано "Android", ви знайдете список, коли натискаєте його. Тому,

Android -> Project -> app -> libs

, Потім поставте туди банки.

3- в build.gradle (модуль: додаток) додати

compile fileTree(dir: 'libs', include: ['*.jar'])

в

 dependency { 
   }

4- У клас java додайте цей імпорт:

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.params.CoreProtocolPNames;

14

HttpClient більше не підтримується в sdk 23. Випуск Android 6.0 (API рівень 23) знімає підтримку клієнта Apache HTTP. Ви повинні використовувати

android {
    useLibrary 'org.apache.http.legacy'
    .
    .
    .

а також додайте нижче фрагмент коду у вашу залежність:

// Кінцеве рішення для веб-сервісу http (включаючи завантаження файлів)

compile('org.apache.httpcomponents:httpmime:4.3.6') {
        exclude module: 'httpclient'
}
 compile 'org.apache.httpcomponents:httpclient-android:4.3.5'

Це також допоможе вам, коли ви використовуєте Використовувати MultipartEntity для завантаження файлів .


Радий почути, що це допомагає тобі :)
android_sh

У мене проблеми з цим ... дублюючим записом: org / apache / http / HttpHeaders.class. Ви знаєте, в чому проблема?
DaniG

7

в API 22 вони застаріли, а в API 23 вони видалили їх повністю. Простий спосіб вирішення, якщо вам не потрібні всі вигадливі речі з нових доповнень, - це просто використовувати .jar файли з apache, які були інтегровані до API 22, але як окремі файли .jar:

1. http://hc.apache.org/downloads.cgi
2. download httpclient 4.5.1, the zile file
3. unzip all files
4. drag in your project httpclient-4.5.1.jar, httpcore-4.4.3.jar and httpmime-4.5.1.jar
5. project, right click, open module settings, app, dependencies, +, File dependency and add the 3 files
6. now everything should compile properly

7

Якщо ви хочете імпортувати такий клас, як:

import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

Ви можете додати наступний рядок у build.gradle (залежності Gradle)

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.0'
    implementation 'com.android.support:support-v4:27.1.0'

    .
    .
    .

    implementation 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

}

Ідеальна відповідь! Мені довелося скористатися wrapped.org.apache, оскільки мені потрібно було оновити дуже старий проект. Дякую.
dianakarenms

6

Ви можете просто додати це до залежностей від Gradle:

compile "org.apache.httpcomponents:httpcore:4.3.2"

2
Це допомагає. Але все одно недостатньо, якщо ви хочете використовувати інші класи на кшталт HttpGet. Для цього я використавcompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro

6

Випуск Android 6.0 (API рівень 23) знімає підтримку клієнта Apache HTTP. Отже, ви не можете використовувати цю бібліотеку безпосередньо в API 23. Але є спосіб її використання. Додайте useLibrary "org.apache.http.legacy" у свій файл build.gradle, як показано нижче-

android {
    useLibrary 'org.apache.http.legacy'
}

Якщо це не спрацює, ви можете застосувати наступний хак-

- Скопіюйте org.apache.http.legacy.jar, який знаходиться в / платформах / android-23 / додатковому шляху вашого каталогу SDK для Android до папки програми / libs вашого проекту.

- Тепер додайте файли компіляції ('libs / org.apache.http.legacy.jar') всередину залежностей {} розділу файла build.gradle.


Останній варіант, який ви дали, робить роботу добре. Я ціную.
Йосип

5

Клієнт ApacheHttp видаляється в v23 sdk. Ви можете використовувати HttpURLConnection або сторонній Http-клієнт, наприклад OkHttp.

посилання: https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client


Використання HttpUrlConnectionфактично заохочується замість HttpClient
Бен Пірсон


4

HttpClient не підтримується в sdk 23 та 23+.

Якщо вам потрібно скористатись sdk 23, додайте нижче код до свого gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

Це працює для мене. Надія корисна для вас.


Чудово співпрацював із версією 24 SDK
Дакш Мехта

4

Якщо вам потрібен sdk 23, додайте це до свого gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

4

Ви повинні додати лише один рядок

useLibrary 'org.apache.http.legacy'

наприклад, у build.gradle (Модуль: додаток)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.0"

    useLibrary 'org.apache.http.legacy'

    defaultConfig {
        applicationId "com.avenues.lib.testotpappnew"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}

3

Яку ціль API ви маєте у своєму проекті? AndroidHttpClientпризначено лише для рівня 8 API. і, будь ласка, подивіться тут

насолоджуйся своїм кодом :)


3

Як було сказано раніше, org.apache.http.client.HttpClientбільше не підтримується в:

SDK (рівень API) №23.

Ви повинні використовувати java.net.HttpURLConnection.

Якщо ви хочете , щоб ваш код (і життя) простіше при використанні HttpURLConnection, ось Wrapperз цього класу , який дозволить вам робити прості операції з GET, POSTі з PUTвикористанням JSON, як, наприклад, робити HTTP PUT.

HttpRequest request = new HttpRequest(API_URL + PATH).addHeader("Content-Type", "application/json");
int httpCode = request.put(new JSONObject().toString());
if (HttpURLConnection.HTTP_OK == httpCode) {
    response = request.getJSONObjectResponse();
} else {
  // log error
}
httpRequest.close()

Сміливо користуйтеся ним.

package com.calculistik.repository;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * <p>
 * Copyright © 2017, Calculistik . All rights reserved.
 * <p>
 * Oracle and Java are registered trademarks of Oracle and/or its
 * affiliates. Other names may be trademarks of their respective owners.
 * <p>
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common
 * Development and Distribution License("CDDL") (collectively, the
 * "License"). You may not use this file except in compliance with the
 * License. You can obtain a copy of the License at
 * https://netbeans.org/cddl-gplv2.html or
 * nbbuild/licenses/CDDL-GPL-2-CP. See the License for the specific
 * language governing permissions and limitations under the License.
 * When distributing the software, include this License Header
 * Notice in each file and include the License file at
 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this particular file
 * as subject to the "Classpath" exception as provided by Oracle in the
 * GPL Version 2 section of the License file that accompanied this code. If
 * applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 * <p>
 * Contributor(s):
 * Created by alejandro tkachuk @aletkachuk
 * www.calculistik.com
 */
public class HttpRequest {

    public static enum Method {
        POST, PUT, DELETE, GET;
    }

    private URL url;
    private HttpURLConnection connection;
    private OutputStream outputStream;
    private HashMap<String, String> params = new HashMap<String, String>();

    public HttpRequest(String url) throws IOException {
        this.url = new URL(url);
        connection = (HttpURLConnection) this.url.openConnection();
    }

    public int get() throws IOException {
        return this.send();
    }

    public int post(String data) throws IOException {
        connection.setDoInput(true);
        connection.setRequestMethod(Method.POST.toString());
        connection.setDoOutput(true);
        outputStream = connection.getOutputStream();
        this.sendData(data);
        return this.send();
    }

    public int post() throws IOException {
        connection.setDoInput(true);
        connection.setRequestMethod(Method.POST.toString());
        connection.setDoOutput(true);
        outputStream = connection.getOutputStream();
        return this.send();
    }

    public int put(String data) throws IOException {
        connection.setDoInput(true);
        connection.setRequestMethod(Method.PUT.toString());
        connection.setDoOutput(true);
        outputStream = connection.getOutputStream();
        this.sendData(data);
        return this.send();
    }

    public int put() throws IOException {
        connection.setDoInput(true);
        connection.setRequestMethod(Method.PUT.toString());
        connection.setDoOutput(true);
        outputStream = connection.getOutputStream();
        return this.send();
    }

    public HttpRequest addHeader(String key, String value) {
        connection.setRequestProperty(key, value);
        return this;
    }

    public HttpRequest addParameter(String key, String value) {
        this.params.put(key, value);
        return this;
    }

    public JSONObject getJSONObjectResponse() throws JSONException, IOException {
        return new JSONObject(getStringResponse());
    }

    public JSONArray getJSONArrayResponse() throws JSONException, IOException {
        return new JSONArray(getStringResponse());
    }

    public String getStringResponse() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder response = new StringBuilder();
        for (String line; (line = br.readLine()) != null; ) response.append(line + "\n");
        return response.toString();
    }

    public byte[] getBytesResponse() throws IOException {
        byte[] buffer = new byte[8192];
        InputStream is = connection.getInputStream();
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        for (int bytesRead; (bytesRead = is.read(buffer)) >= 0; )
            output.write(buffer, 0, bytesRead);
        return output.toByteArray();
    }

    public void close() {
        if (null != connection)
            connection.disconnect();
    }

    private int send() throws IOException {
        int httpStatusCode = HttpURLConnection.HTTP_BAD_REQUEST;

        if (!this.params.isEmpty()) {
            this.sendData();
        }
        httpStatusCode = connection.getResponseCode();

        return httpStatusCode;
    }

    private void sendData() throws IOException {
        StringBuilder result = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            result.append((result.length() > 0 ? "&" : "") + entry.getKey() + "=" + entry.getValue());//appends: key=value (for first param) OR &key=value(second and more)
        }
        sendData(result.toString());
    }

    private HttpRequest sendData(String query) throws IOException {
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(query);
        writer.close();
        return this;
    }

}

2

Додайте ці два рядки в залежності

compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'

тоді

useLibrary 'org.apache.http.legacy'

під андроїд


1

Інший спосіб - якщо у вас є файл httpclient.jar, ви можете зробити це:

Вставте .jar файл у "папку libs" у вашому проекті. Потім у gradle додайте цей рядок у build.gradle (Модуль: додаток)

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.0'
compile files('libs/httpcore-4.3.3.jar')
}

0

Помилка: (30, 0) DSL-метод Gradle не знайдено: 'classpath ()' Можливі причини:

  • Проект 'cid' може використовувати версію плагіна Android Gradle, який не містить методу (наприклад, 'testCompile' додано в 1.1.0). Оновіть плагін до версії 2.3.3 та синхронізуйте проект
  • Проект 'cid' може використовувати версію Gradle, яка не містить методу. Відкрийте файл обгортки Gradle
  • У файлі збірки може бути відсутній плагін Gradle. Застосувати плагін Gradle

  • 0

    Для android API 28 та новіших версій у Manifest.xml всередині тегу додатків

        <application
        .
        .
        .
    
        <uses-library android:name="org.apache.http.legacy" android:required="false"/>

    -1

    Я думаю, що залежно від того, яку версію Android Studio у вас є, важливо також оновити свою андроїд-студію, я також засмучувався, дотримуючись порад всіх, але не пощастило, поки мені не довелося оновити свою версію Android з 1.3 до 1.5, помилки зникли як магія.

    Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
    Licensed under cc by-sa 3.0 with attribution required.