HttpClient non verrà importato in Android Studio


359

Ho una semplice classe scritta in Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

e da questo ottengo il seguente errore di compilazione:

Cannot resolve symbol HttpClient

Non è HttpClientincluso in Android Studio SDK? Anche se non lo è, l'ho aggiunto alla mia build Gradle in questo modo:

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

Con o senza l'ultima riga di compilazione, l'errore è lo stesso. Cosa mi sto perdendo?


4
Prova a usare AndroidHttpClientse puoi. Gli stub HttpClient sono effettivamente contenuti all'interno del vaso Android, quindi non dovrebbe essere necessario fare riferimento ad esso esplicitamente. Si noti che la versione Android di httpclient è probabilmente 4.1.1. Cercare di utilizzare una versione più recente in genere richiede problemi (leggi: non funziona, perché il classloader del firmware vince sempre).
Scorri il

Risposte:


813

HttpClientnon è più supportato in SDK 23. È necessario utilizzare URLConnectiono eseguire il downgrade a SDK 22 (compile 'com.android.support:appcompat-v7:22.2.0' )

Se hai bisogno di sdk 23, aggiungi questo al tuo voto:

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

Puoi anche provare a scaricare e includere il vaso HttpClient direttamente nel tuo progetto o utilizzare invece OkHttp


3
Link
dell'annuncio

20
Non fa nulla nel mio caso. Come mai?
Sviluppatore Android

2
useLibrary non può essere risolto quando lo aggiungo. Il mio obiettivo è 23, cosa mi sto perdendo?
Badr,

1
android { useLibrary 'org.apache.http.legacy' } [quando lo aggiungi] [1] 'org.apache.http' android-studio ha ancora suggerimenti: 'Impossibile risolvere il simbolo' [2] questo può far sì che android-studio (con sdk23) possa essere costruito. anche se ci sono suggerimenti (Impossibile risolvere il simbolo) [3] se aggiungi jar, non ci sono suggerimenti, può essere compilato, ma !!! non può essere eseguito, perché ha due copie 'org.apache.http'
YETI

1
Per tutti quelli che usano la Volleylibreria, prendi nota che questa aggiunta di gradle dovrebbe andare nel file gradle della libreria e non nella tua app. Funziona perfettamente! Grazie mille!
sravan953,

162

HttpClient è stato deprecato in API Level 22 e rimosso in API Level 23. Puoi comunque utilizzarlo in API Level 23 e successive, se necessario, tuttavia è meglio passare ai metodi supportati per gestire HTTP. Quindi, se stai compilando con 23, aggiungi questo nel tuo build.gradle:

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

4
android { useLibrary 'org.apache.http.legacy' } [quando lo aggiungi] [1] 'org.apache.http' android-studio ha ancora suggerimenti: 'Impossibile risolvere il simbolo' [2] questo può far sì che android-studio (con sdk23) possa essere costruito. anche se ci sono suggerimenti (Impossibile risolvere il simbolo) [3] se aggiungi jar, non ci sono suggerimenti, può essere compilato, ma !!! non può essere eseguito, perché ha due copie 'org.apache.http'
YETI

1
[2.1] Quindi chiudi Android Studio e riavvialo, non aprire i file che utilizzano il codice legacy e i "suggerimenti" non verranno applicati. Se devi aprire il file, ti suggerisce di possedere il codice, quindi [4] dovresti smettere di usare HttpClient nel codice che controlli.
straya,

Non so perché (build-tool & sdk) 23 si comporti in modo così strano. Lo sviluppatore del supporto donot di eventi usa "apche http" nella propria mente.
ANCORA

1
Devi aggiornare Android Studio all'ultima versione per evitare questo comportamento ...... è stato risolto nella nuova versione
rawcoder064

Quali sono i "metodi supportati per gestire HTTP"?
Waldgeist,

59

La risposta di TejaDroid nel link sottostante mi ha aiutato. Impossibile importare org.apache.http.HttpResponse in 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'
    ...
}

grazie questa è l'unica soluzione che ha funzionato con le nuove build eperimentali poiché useLibrary non è riconosciuto in esso
pt123

Questa è in realtà una risposta migliore di quella sopra! funziona con le versioni più recenti del compilatore
Matan Dahan,

48

Per utilizzare Apache HTTP per SDK livello 23:

Build.gradle di primo livello - /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/
    }
    ...
}

Notifica da Android Studio sull'aggiornamento gradle:

Notifica da Android Studio sull'aggiornamento gradle

Build.gradle specifico del modulo - /app/build.gradle

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

31

Prova questo ha funzionato per me Aggiungi questa dipendenza al tuo file build.gradle

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

16

1- scarica i file jar di Apache (a partire da questa risposta) file 4.5.zip da:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- apri la zip copia i file jar nella cartella libs. Puoi trovarlo se vai nella parte superiore del tuo progetto dove dice "Android" troverai un elenco quando fai clic su di esso. Così,

Android -> Progetto -> app -> libs

, Quindi metti dei barattoli lì.

3- In build.gradle (Modulo: app) aggiungere

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

in

 dependency { 
   }

4- Nella classe java aggiungi queste importazioni:

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 non è più supportato in sdk 23. La versione di Android 6.0 (API Level 23) rimuove il supporto per il client HTTP Apache. Devi usare

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

e aggiungi anche lo snippet di codice seguente nella tua dipendenza:

// soluzione finale http per il servizio Web (incluso il caricamento di file)

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

Ti aiuterà anche mentre usi Usa MultipartEntity per il caricamento di file .


Sono contento di sapere che ti aiuta :)
android_sh,

Ho dei problemi con quella ... voce duplicata: org / apache / http / HttpHeaders.class. Sai qual è il problema?
DaniG

7

in API 22 diventano deprecati e in API 23 li hanno rimossi completamente, una semplice soluzione se non hai bisogno di tutte le cose fantasiose dalle nuove aggiunte è semplicemente usare i file .jar da apache che sono stati integrati prima dell'API 22, ma come file .jar separati:

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

Se vuoi importare qualche classe come:

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;

È possibile aggiungere la seguente riga in build.gradle (dipendenze del grado)

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'

}

Risposta perfetta! Ho dovuto usare il wrapped.org.apache poiché avevo bisogno di aggiornare un progetto molto vecchio. Grazie.
dianakarenms,

6

Puoi semplicemente aggiungere questo alle dipendenze Gradle:

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

2
Questo aiuta. Ma non è ancora abbastanza se vuoi usare altre classi come HttpGet. Per questo ho usatocompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro il

6

La versione di Android 6.0 (API Level 23) rimuove il supporto per il client HTTP Apache. Quindi non puoi usare questa libreria direttamente nell'API 23. Ma c'è un modo per usarla. Aggiungi useLibrary 'org.apache.http.legacy' nel tuo file build.gradle come sotto-

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

Se questo non funziona, puoi applicare il seguente hack-

- Copia org.apache.http.legacy.jar che si trova in / platform / android-23 / percorso facoltativo della tua directory SDK Android nella cartella app / libs del tuo progetto.

- Ora aggiungi i file di compilazione ('libs / org.apache.http.legacy.jar') all'interno della sezione delle dipendenze {} del file build.gradle.


L'ultima opzione che hai dato fa bene il lavoro. Apprezzo.
Giuseppe,

5

Il client ApacheHttp è stato rimosso in v23 sdk. È possibile utilizzare HttpURLConnection o un client Http di terze parti come OkHttp.

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


L'uso di HttpUrlConnectionè effettivamente incoraggiato al posto di HttpClient
Ben Pearson,

4

Basta usare questo: -

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

4

HttpClient non è supportato in SDK 23 e 23+.

Se devi usare in sdk 23, aggiungi il codice seguente al tuo voto:

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

Funziona per me. Spero utile per te.


Ha funzionato perfettamente con SDK versione 24
Daksh Mehta,

4

Se hai bisogno di sdk 23, aggiungi questo al tuo voto:

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

4

Devi aggiungere solo una riga

useLibrary 'org.apache.http.legacy'

in build.gradle (Modulo: app), ad esempio

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

Quale target API hai all'interno del tuo progetto? AndroidHttpClientè solo per API Level 8 <. e per favore dai un'occhiata qui

goditi il ​​tuo codice :)


3

Come accennato in precedenza, org.apache.http.client.HttpClientnon è più supportato in:

SDK (livello API) # 23.

Devi usare java.net.HttpURLConnection.

Se si vuole rendere il codice (e la vita) più facile quando si usa HttpURLConnection, ecco una Wrapperdi questa classe che vi permetterà di fare operazioni semplici con GET, POSTe PUTutilizzando JSON, come per esempio, facendo 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()

Sentiti libero di usarlo.

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

Aggiungi queste due righe sotto le dipendenze

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

poi

useLibrary 'org.apache.http.legacy'

sotto l'androide


1

Un altro modo è se si dispone del file httpclient.jar , quindi è possibile farlo:

Incolla il tuo file .jar in "cartella libs" nel tuo progetto. Quindi in gradle aggiungi questa riga nel tuo build.gradle (Modulo: 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

Errore: (30, 0) Metodo DSL Gradle non trovato: 'classpath ()' Possibili cause:

  • Il progetto "cid" potrebbe utilizzare una versione del plug-in Android Gradle che non contiene il metodo (ad esempio, "testCompile" è stato aggiunto in 1.1.0). Aggiorna il plugin alla versione 2.3.3 e sincronizza il progetto
  • Il progetto "cid" potrebbe utilizzare una versione di Gradle che non contiene il metodo. Apri il file wrapper Gradle
  • Nel file di build potrebbe mancare un plug-in Gradle. Applica il plug-in Gradle

  • 0

    Per Android API 28 e versioni successive in Manifest.xml all'interno del tag dell'applicazione

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

    -1

    Penso che, a seconda della versione di Android Studio in uso, è importante aggiornare anche il tuo studio Android, anch'io mi stavo frustrando seguendo i consigli di tutti, ma senza fortuna, fino a quando non ho dovuto aggiornare la mia versione Android da 1.3 a 1.5, gli errori sono scomparsi come Magia.

    Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
    Licensed under cc by-sa 3.0 with attribution required.