HttpClient wird nicht in Android Studio importiert

359

Ich habe eine einfache Klasse in Android Studio geschrieben:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

und daraus erhalte ich folgenden Fehler beim Kompilieren:

Cannot resolve symbol HttpClient

Ist nicht HttpClientim Android Studio SDK enthalten? Auch wenn dies nicht der Fall ist, habe ich es wie folgt zu meinem Gradle-Build hinzugefügt:

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

Mit oder ohne die letzte Kompilierungszeile ist der Fehler der gleiche. Was vermisse ich?

AndroidDev
quelle
4
Versuchen Sie zu verwenden, AndroidHttpClientwenn Sie können. HttpClient-Stubs sind in der Tat im Android-Jar enthalten, sodass es nicht erforderlich sein sollte, explizit darauf zu verweisen. Beachten Sie, dass die Android-Version von httpclient wahrscheinlich 4.1.1 ist. Der Versuch, eine neuere Version zu verwenden, führt normalerweise zu Problemen (lesen Sie: funktioniert nicht, da der Firmware-Klassenladeprogramm immer gewinnt).
Dhke

Antworten:

813

HttpClientwird in sdk 23 nicht mehr unterstützt. Sie müssen URLConnectionsdk 22 ( compile 'com.android.support:appcompat-v7:22.2.0') verwenden oder ein Downgrade durchführen.

Wenn Sie SDK 23 benötigen, fügen Sie dies Ihrem Gradle hinzu:

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

Sie können auch versuchen, HttpClient jar direkt in Ihr Projekt herunterzuladen und einzuschließen, oder stattdessen OkHttp verwenden

Ilya Blokh
quelle
3
Ankündigungslink: developer.android.com/preview/…
dhke
20
In meinem Fall macht es nichts. Woher?
Android-Entwickler
2
useLibrary kann nicht aufgelöst werden, wenn ich es hinzufüge. Mein Ziel ist 23, was vermisse ich?
Badr
1
android { useLibrary 'org.apache.http.legacy' } [wenn du dies hinzufügst] [1] 'org.apache.http' android-studio hat noch tipps: 'Symbol kann nicht aufgelöst werden' [2] dieses make android-studio (mit sdk23) kann bauen. Obwohl es Tipps gibt (Symbol kann nicht aufgelöst werden) [3] Wenn Sie jar hinzufügen, kann es keine Tipps erstellen, aber !!! kann nicht ausgeführt werden, da es zwei Kopien 'org.apache.http' hat
YETI
1
VolleyBeachten Sie für alle Benutzer der Bibliothek, dass dieser Gradle-Zeilenzusatz in die Gradle-Datei für die Bibliothek und nicht in Ihre App aufgenommen werden sollte. Funktioniert perfekt! Danke vielmals!
sravan953
162

HttpClient wurde in API Level 22 veraltet und in API Level 23 entfernt. Sie können es weiterhin in API Level 23 und höher verwenden, wenn Sie müssen. Es ist jedoch am besten, zu unterstützten Methoden zu wechseln, um HTTP zu verarbeiten. Wenn Sie also mit 23 kompilieren, fügen Sie dies in Ihr build.gradle ein:

android {
    useLibrary 'org.apache.http.legacy'
}
streunend
quelle
4
android { useLibrary 'org.apache.http.legacy' } [wenn du dies hinzufügst] [1] 'org.apache.http' android-studio hat noch tipps: 'Symbol kann nicht aufgelöst werden' [2] dieses make android-studio (mit sdk23) kann bauen. Obwohl es Tipps gibt (Symbol kann nicht aufgelöst werden) [3] Wenn Sie jar hinzufügen, kann es keine Tipps erstellen, aber !!! kann nicht ausgeführt werden, da es zwei Kopien 'org.apache.http' hat
YETI
1
[2.1] Schließen Sie also Android Studio und starten Sie es erneut. Öffnen Sie nicht die Datei (en), die den Legacy-Code verwenden, und die "Tipps" werden nicht angewendet. Wenn Sie die Datei öffnen müssen, wird vorgeschlagen, dass Sie den Code besitzen. [4] Sie sollten daher die Verwendung von HttpClient in dem von Ihnen kontrollierten Code einstellen.
Straya
Ich weiß nicht warum (Build-Tool & SDK) 23 sich so verrückt verhält. Event Donot Support Entwickler verwenden 'apche http' im Kopf.
YETI
1
Sie müssen das Android Studio auf die neueste Version aktualisieren, um dieses Verhalten zu vermeiden. Es ist in der neuen Version
behoben
Was sind die "unterstützten Methoden zum Umgang mit HTTP"?
Waldgeist
59

Die Antwort von TejaDroid im folgenden Link hat mir geholfen. Org.apache.http.HttpResponse kann in Android Studio nicht importiert werden

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'
    ...
}
Vinay
quelle
danke, dies ist die einzige Lösung, die mit den neuen experimentellen Builds funktioniert hat, da useLibrary darin nicht erkannt wird
pt123
Dies ist tatsächlich eine bessere Antwort als die oben genannte! es funktioniert mit neueren Versionen des Compilers
Matan Dahan
48

So verwenden Sie Apache HTTP für SDK Level 23:

Top level 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/
    }
    ...
}

Benachrichtigung von Android Studio über Gradle Update:

Benachrichtigung von Android Studio über Gradle Update

Modulspezifisches build.gradle - /app/build.gradle

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

Versuchen Sie, dass dies für mich funktioniert hat. Fügen Sie diese Abhängigkeit zu Ihrer build.gradle-Datei hinzu

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
Pritish Joshi
quelle
16

1- Laden Sie die Apache-JAR-Dateien herunter (ab dieser Antwort). 4.5.zip-Datei von:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- Öffnen Sie die Zip-Kopie und kopieren Sie die JAR-Dateien in Ihren libs-Ordner. Sie können es finden, wenn Sie zum Anfang Ihres Projekts gehen, wo "Android" steht. Wenn Sie darauf klicken, finden Sie eine Liste. Damit,

Android -> Projekt -> App -> Bibliotheken

Dann stellen Sie Gläser dort.

3- In build.gradle (Modul: App) hinzufügen

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

im

 dependency { 
   }

4- Fügen Sie in der Java-Klasse die folgenden Importe hinzu:

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;
Badr
quelle
14

HttpClient wird in SDK 23 nicht mehr unterstützt. Die Version Android 6.0 (API Level 23) entfernt die Unterstützung für den Apache HTTP-Client. Du musst benutzen

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

und fügen Sie in Ihrer Abhängigkeit auch das folgende Code-Snippet hinzu:

// http endgültige Lösung für den Webdienst (einschließlich Hochladen von Dateien)

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

Es hilft Ihnen auch bei der Verwendung von Use MultipartEntity für das Hochladen von Dateien .

android_sh
quelle
Freut mich
Ich habe Probleme damit ... doppelter Eintrag: org / apache / http / HttpHeaders.class. Weißt du was das Problem ist?
DaniG
7

In API 22 sind sie veraltet und in API 23 wurden sie vollständig entfernt. Eine einfache Problemumgehung, wenn Sie nicht alle ausgefallenen Dinge aus den neuen Ergänzungen benötigen, besteht darin, einfach die .jar-Dateien von Apache zu verwenden, die vor API 22 integriert wurden als getrennte .jar-Dateien:

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
Catalin
quelle
7

Wenn Sie eine Klasse importieren möchten, wie:

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;

Sie können die folgende Zeile in build.gradle einfügen (Gradle-Abhängigkeiten)

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'

}
A. Bahrami
quelle
Perfekte Antwort! Ich musste die Datei wrap.org.apache verwenden, da ich ein sehr altes Projekt aktualisieren musste. Vielen Dank.
Dianakarenms
6

Sie können dies einfach zu Gradle-Abhängigkeiten hinzufügen:

compile "org.apache.httpcomponents:httpcore:4.3.2"
Mostafa Abdellateef
quelle
2
Das hilft. Aber immer noch nicht genug, wenn Sie andere Klassen wie verwenden möchten HttpGet. Dafür habe ichcompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro
6

Die Version 6.0 (API Level 23) entfernt die Unterstützung für den Apache HTTP-Client. Daher können Sie diese Bibliothek nicht direkt in API 23 verwenden. Es gibt jedoch eine Möglichkeit, sie zu verwenden. Fügen Sie useLibrary 'org.apache.http.legacy' wie folgt in Ihre build.gradle-Datei ein.

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

Wenn dies nicht funktioniert, können Sie den folgenden Hack anwenden:

- Kopieren Sie org.apache.http.legacy.jar, das sich in / platform / android-23 / optionalem Pfad Ihres Android SDK-Verzeichnisses befindet, in den Ordner app / libs Ihres Projekts.

- Fügen Sie nun Kompilierungsdateien ('libs / org.apache.http.legacy.jar') im Abschnitt dependencies {} der Datei build.gradle hinzu.

user3766643
quelle
Die letzte Option, die Sie gegeben haben, macht den Job gut. Ich schätze.
Joseph
5

ApacheHttp Client wird in v23 sdk entfernt. Sie können HttpURLConnection oder einen Http-Client eines Drittanbieters wie OkHttp verwenden.

ref: https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client

Kirtan
quelle
Die Verwendung von HttpUrlConnectionwird anstelle von HttpClient
Ben Pearson
4

Verwenden Sie einfach Folgendes: -

android {
         .
         .
         .
 useLibrary 'org.apache.http.legacy'
         .
         .
         .
          }
Kaushal Kishor
quelle
4

HttpClient wird in SDK 23 und 23+ nicht unterstützt.

Wenn Sie in SDK 23 verwenden müssen, fügen Sie Ihrem Gradle den folgenden Code hinzu:

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

Es funktioniert für mich. Hoffe nützlich für dich.

Sneha Patel
quelle
Funktionierte perfekt mit SDK Version 24
Daksh Mehta
4

Wenn Sie SDK 23 benötigen, fügen Sie dies Ihrem Gradle hinzu:

android {
    useLibrary 'org.apache.http.legacy'
}
Shiv Buyya
quelle
4

Sie müssen nur eine Zeile hinzufügen

useLibrary 'org.apache.http.legacy'

zum Beispiel in build.gradle (Modul: App)

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'
}
Nilesh Panchal
quelle
3

Welches API-Ziel haben Sie in Ihrem Projekt? AndroidHttpClientist nur für API Level 8 <. und bitte schauen Sie mal rein hier

Viel Spaß mit deinem Code :)

John Smith
quelle
3

Wie bereits erwähnt, org.apache.http.client.HttpClient wird nicht mehr unterstützt in:

SDK (API-Ebene) # 23.

Du musst benutzen java.net.HttpURLConnection .

Wenn Sie Ihren Code (und das Leben) machen wollen leichter bei der Verwendung von HttpURLConnection, hier ist eine Wrapperdieser Klasse , die Sie tun einfache Operationen mit läßt GET, POSTund PUTunter Verwendung JSON, wie zum Beispiel eines tun 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()

Fühlen Sie sich frei, es zu benutzen.

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

}
Alejandro Pablo Tkachuk
quelle
2

Fügen Sie diese beiden Zeilen unter Abhängigkeiten hinzu

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

dann

useLibrary 'org.apache.http.legacy'

unter dem android

Ramindu Rusara Senarath
quelle
1

Eine andere Möglichkeit ist, wenn Sie die Datei httpclient.jar haben, Folgendes zu tun:

Fügen Sie Ihre JAR-Datei in den Ordner "libs" Ihres Projekts ein. Fügen Sie dann in gradle diese Zeile in Ihr build.gradle ein (Modul: App)

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

Fehler: (30, 0) Gradle DSL-Methode nicht gefunden: 'classpath ()' Mögliche Ursachen:

  • Das Projekt 'cid' verwendet möglicherweise eine Version des Android Gradle-Plug-Ins, die die Methode nicht enthält (z. B. 'testCompile' wurde in 1.1.0 hinzugefügt). Aktualisieren Sie das Plugin auf Version 2.3.3 und synchronisieren Sie das Projekt
  • Das Projekt 'cid' verwendet möglicherweise eine Version von Gradle, die die Methode nicht enthält. Öffnen Sie die Gradle-Wrapper-Datei
  • In der Build-Datei fehlt möglicherweise ein Gradle-Plugin. Wenden Sie das Gradle-Plugin an
  • Eshan Chattaraj
    quelle
    0

    Für Android API 28 und höher in Manifest.xml im Anwendungs-Tag

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

    Ich denke, je nachdem, welche Android Studio-Version Sie haben, ist es wichtig, dass Sie auch Ihr Android Studio aktualisieren. Ich war auch frustriert, wenn ich allen Ratschlägen folgte, aber kein Glück, bis ich meine Android-Version von 1.3 auf 1.5 aktualisieren musste, verschwanden die Fehler wie folgt Magie.

    steven89806
    quelle