HttpClient ne sera pas importé dans Android Studio

359

J'ai une classe simple écrite dans Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

et j'obtiens l'erreur de temps de compilation suivante:

Cannot resolve symbol HttpClient

N'est pas HttpClientinclus dans le SDK Android Studio? Même si ce n'est pas le cas, je l'ai ajouté à ma version Gradle comme ceci:

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

Avec ou sans la dernière ligne de compilation, l'erreur est la même. Qu'est-ce que je rate?

AndroidDev
la source
4
Essayez d'utiliser AndroidHttpClientsi vous le pouvez. Les talons HttpClient sont en effet contenus dans le pot Android, il ne devrait donc pas être nécessaire de s'y référer explicitement. Notez que la version Android de httpclient est probablement 4.1.1. Essayer d'utiliser une version plus récente en plus pose généralement des problèmes (lire: ne fonctionne pas, car le chargeur de classe du firmware gagne toujours).
dhke

Réponses:

813

HttpClientn'est plus pris en charge dans sdk 23. Vous devez utiliser URLConnectionou rétrograder vers sdk 22 ( compile 'com.android.support:appcompat-v7:22.2.0')

Si vous avez besoin de SDK 23, ajoutez ceci à votre gradle:

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

Vous pouvez également essayer de télécharger et d'inclure le pot HttpClient directement dans votre projet ou d'utiliser OkHttp à la place

Ilya Blokh
la source
3
Lien d'annonce: developer.android.com/preview/…
dhke
20
Cela ne fait rien dans mon cas. Comment venir?
développeur Android
2
useLibrary ne peut pas être résolu lorsque je l'ajoute. Mon objectif est 23, ce qui me manque?
Badr
1
android { useLibrary 'org.apache.http.legacy' } [quand vous ajoutez ceci] [1] 'org.apache.http' android-studio a toujours des astuces: 'Impossible de résoudre le symbole' [2] ceci permet à android-studio (avec sdk23) de construire. bien qu'il y ait des astuces (ne peut pas résoudre le symbole) [3] si vous ajoutez un pot, il n'y a pas d'astuces, vous pouvez le construire, mais !!! ne peut pas fonctionner, car il a deux copies 'org.apache.http'
YETI
1
Pour tous ceux qui utilisent la Volleybibliothèque, notez que cet ajout de ligne Gradle devrait aller dans le fichier Gradle de la bibliothèque, et non dans votre application. Marche parfaitement! Merci beaucoup!
sravan953
162

HttpClient a été déconseillé dans l'API de niveau 22 et supprimé dans l'API de niveau 23. Vous pouvez toujours l'utiliser dans l'API de niveau 23 et supérieur si vous le devez, mais il est préférable de passer aux méthodes prises en charge pour gérer HTTP. Donc, si vous compilez avec 23, ajoutez ceci dans votre build.gradle:

android {
    useLibrary 'org.apache.http.legacy'
}
straya
la source
4
android { useLibrary 'org.apache.http.legacy' } [quand vous ajoutez ceci] [1] 'org.apache.http' android-studio a toujours des astuces: 'Impossible de résoudre le symbole' [2] ceci permet à android-studio (avec sdk23) de construire. bien qu'il y ait des astuces (ne peut pas résoudre le symbole) [3] si vous ajoutez un pot, il n'y a pas d'astuces, vous pouvez le construire, mais !!! ne peut pas s'exécuter, car il a deux copies 'org.apache.http'
YETI
1
[2.1] Fermez donc Android Studio et redémarrez-le, n'ouvrez pas les fichiers qui utilisent le code hérité et les "astuces" ne seront pas appliquées. Si vous devez ouvrir le fichier, il vous suggère de posséder le code, donc [4] vous devez cesser d'utiliser HttpClient dans le code que vous contrôlez.
straya
Je ne sais pas pourquoi (build-tool & sdk) 23 est si bizarre. L'événement ne supporte pas que le développeur utilise «apche http» dans son esprit.
YETI
1
Vous devez mettre à jour le studio Android vers la dernière version pour éviter ce problème ...... son corrigé dans la nouvelle version
rawcoder064
Quelles sont les "méthodes prises en charge pour gérer HTTP"?
waldgeist
59

La réponse de TejaDroid dans le lien ci-dessous m'a aidé. Impossible d'importer org.apache.http.HttpResponse dans 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'
    ...
}
Vinay
la source
merci, c'est la seule solution qui a fonctionné avec les nouvelles versions expérimentales car useLibrary n'y est pas reconnu
pt123
C'est en fait une meilleure réponse que celle ci-dessus! il fonctionne avec les nouvelles versions du compilateur
Matan Dahan
48

Pour utiliser Apache HTTP pour SDK niveau 23:

Build.gradle de niveau supérieur - /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/
    }
    ...
}

Notification du studio Android sur la mise à jour de Gradle:

Notification du studio Android sur la mise à jour de Gradle

Build.gradle spécifique au module - /app/build.gradle

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

Essayez cela a fonctionné pour moi Ajoutez cette dépendance à votre fichier build.gradle

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

1- télécharger les fichiers jar Apache (à partir de cette réponse) fichier 4.5.zip depuis:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- ouvrez le zip copiez les fichiers jar dans votre dossier libs. Vous pouvez le trouver si vous allez en haut de votre projet où il est dit "Android", vous trouverez une liste lorsque vous cliquez dessus. Donc,

Android -> Projet -> app -> libs

, Ensuite, mettez des pots là-bas.

3- Dans build.gradle (Module: app) ajoutez

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

dans

 dependency { 
   }

4- Dans la classe java ajoutez ces importations:

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
la source
14

HttpClient n'est plus pris en charge dans le SDK 23. La version Android 6.0 (API niveau 23) supprime la prise en charge du client HTTP Apache. Vous devez utiliser

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

et ajoutez également l'extrait de code ci-dessous dans votre dépendance:

// http solution finale pour le service Web (y compris le téléchargement de fichiers)

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

Il vous aidera également lors de l'utilisation de l' option Utiliser plusieurs entités pour le téléchargement de fichiers .

android_sh
la source
Heureux d'entendre que cela vous aide :)
android_sh
J'ai des problèmes avec cette entrée en double: org / apache / http / HttpHeaders.class. Savez-vous quel est le problème?
DaniG
7

dans l'API 22, ils deviennent obsolètes et dans l'API 23, ils les ont complètement supprimés, une solution de contournement simple si vous n'avez pas besoin de toutes les nouveautés des nouveaux ajouts consiste à simplement utiliser les fichiers .jar d'Apache qui étaient intégrés avant l'API 22, mais en tant que fichiers .jar séparés:

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
la source
7

Si vous voulez importer une classe comme:

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;

Vous pouvez ajouter la ligne suivante dans le build.gradle (dépendances 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'

}
A.Bahrami
la source
Réponse parfaite! J'ai dû utiliser le wrapped.org.apache car j'avais besoin de mettre à jour un très vieux projet. Merci.
dianakarenms
6

Vous pouvez simplement ajouter ceci aux dépendances Gradle:

compile "org.apache.httpcomponents:httpcore:4.3.2"
Mostafa Abdellateef
la source
2
CA aide. Mais toujours pas assez si vous voulez utiliser d'autres classes comme HttpGet. Pour cela, j'ai utilisécompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro
6

La version Android 6.0 (API niveau 23) supprime la prise en charge du client HTTP Apache. Par conséquent, vous ne pouvez pas utiliser cette bibliothèque directement dans l'API 23. Mais il existe un moyen de l'utiliser. Ajoutez useLibrary 'org.apache.http.legacy' dans votre fichier build.gradle comme ci-dessous-

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

Si cela ne fonctionne pas, vous pouvez appliquer le hack-

- Copiez org.apache.http.legacy.jar qui se trouve dans / platformes / android-23 / chemin facultatif de votre répertoire SDK Android dans le dossier app / libs de votre projet.

- Maintenant, ajoutez des fichiers de compilation ('libs / org.apache.http.legacy.jar') dans la section des dépendances {} du fichier build.gradle.

user3766643
la source
La dernière option que vous avez donnée fait bien le travail. J'apprécie.
Joseph
5

ApacheHttp Client est supprimé dans v23 sdk. Vous pouvez utiliser HttpURLConnection ou un client Http tiers comme OkHttp.

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

Kirtan
la source
L'utilisation de HttpUrlConnectionest en fait encouragée à la place de HttpClient
Ben Pearson
4

Utilisez simplement ceci: -

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

HttpClient n'est pas pris en charge dans sdk 23 et 23+.

Si vous devez utiliser dans sdk 23, ajoutez le code ci-dessous à votre gradle:

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

Cela fonctionne pour moi. J'espère utile pour vous.

Sneha Patel
la source
Fonctionne parfaitement avec la version 24 du SDK
Daksh Mehta
4

Si vous avez besoin de SDK 23, ajoutez ceci à votre gradle:

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

Vous devez ajouter une seule ligne

useLibrary 'org.apache.http.legacy'

dans build.gradle (Module: app), par exemple

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
la source
3

Quelle cible API avez-vous dans votre projet? AndroidHttpClientest uniquement pour l'API niveau 8 <. et s'il vous plaît jetez un oeil ici

profitez de votre code :)

John Smith
la source
3

Comme mentionné précédemment, org.apache.http.client.HttpClientn'est plus pris en charge dans:

SDK (niveau API) # 23.

Vous devez utiliser java.net.HttpURLConnection.

Si vous voulez rendre votre code (et votre vie) plus facile à utiliser HttpURLConnection, voici un Wrapperde cette classe qui vous permettra de faire des opérations simples avec GET, POSTet d' PUTutiliser JSON, comme par exemple, faire un 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()

Sentez-vous libre de l'utiliser.

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
la source
2

Ajoutez ces deux lignes sous les dépendances

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

puis

useLibrary 'org.apache.http.legacy'

sous l'androïde

Ramindu Rusara Senarath
la source
1

Une autre façon est que si vous avez un fichier httpclient.jar , vous pouvez le faire:

Collez votre fichier .jar dans le "dossier libs" de votre projet. Ensuite, dans gradle, ajoutez cette ligne dans votre build.gradle (Module: 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
la source
0

Erreur: (30, 0) Méthode DSL Gradle introuvable: 'classpath ()' Causes possibles:

  • Le projet 'cid' peut utiliser une version du plug-in Android Gradle qui ne contient pas la méthode (par exemple, 'testCompile' a été ajouté en 1.1.0). Mettre à niveau le plugin vers la version 2.3.3 et le projet de synchronisation
  • Le projet 'cid' utilise peut-être une version de Gradle qui ne contient pas la méthode. Ouvrir le fichier wrapper Gradle
  • Il se peut que le fichier de construction ne contienne pas de plugin Gradle. Appliquer le plugin Gradle
  • Eshan Chattaraj
    la source
    0

    Pour Android API 28 et supérieur dans Manifest.xml à l'intérieur de la balise d'application

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

    Je pense qu'en fonction de la version d'Android Studio que vous avez, il est important que vous mettiez également à jour votre studio Android, je devenais frustré aussi en suivant les conseils de tout le monde mais pas de chance, jusqu'à ce que je doive mettre à jour ma version Android de 1.3 à 1.5, les erreurs ont disparu comme la magie.

    steven89806
    la source