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?


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



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

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'
    ...
}

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'
    ...
}

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'

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;

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 .


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

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'

}

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"

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.


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


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

4

Utilisez simplement ceci: -

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

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.


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

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

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 :)


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

}

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


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')
}

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

  • 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"/>

    -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.

    En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
    Licensed under cc by-sa 3.0 with attribution required.