HttpClient nie importuje się w Android Studio


359

Mam prostą klasę napisaną w Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

i z tego otrzymuję następujący błąd czasu kompilacji:

Cannot resolve symbol HttpClient

Nie jest HttpClientdołączony do zestawu SDK Android Studio? Nawet jeśli nie jest, dodałem go do mojej wersji Gradle w następujący sposób:

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

Z ostatnią linią kompilacji lub bez niej błąd jest taki sam. czego mi brakuje?


4
Spróbuj użyć, AndroidHttpClientjeśli możesz. Pliki pośredniczące HttpClient są rzeczywiście zawarte w słoiku z systemem Android, więc nie powinno być potrzeby jawnego odwoływania się do niego. Pamiętaj, że wersja httpclient dla Androida to prawdopodobnie 4.1.1. Próba użycia nowszej wersji zwykle powoduje problemy (czytaj: nie działa, ponieważ moduł ładujący oprogramowanie układowe zawsze wygrywa).
dhke,

Odpowiedzi:


813

HttpClientnie jest już obsługiwany w SDK 23. Musisz użyć URLConnectionlub zmienić wersję na SDK 22 ( compile 'com.android.support:appcompat-v7:22.2.0')

Jeśli potrzebujesz SDK 23, dodaj to do swojej oceny:

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

Możesz także spróbować pobrać i włączyć jar HttpClient bezpośrednio do swojego projektu lub zamiast tego użyć OkHttp


3
Link do ogłoszenia: developer.android.com/preview/…
dhke

20
W moim przypadku nic nie robi. Dlaczego?
programista Androida

2
useLibrary nie może zostać rozwiązany po dodaniu. Mój cel to 23 lata, czego mi brakuje?
Badr

1
android { useLibrary 'org.apache.http.legacy' } [po dodaniu tego] [1] 'org.apache.http' android-studio nadal ma wskazówki: „Nie można rozwiązać symbolu” [2], dzięki czemu android-studio (z sdk23) może budować. chociaż istnieją wskazówki (nie można rozwiązać symbolu) [3], jeśli dodasz jar, nie ma żadnych wskazówek, można zbudować, ale !!! nie można uruchomić, ponieważ ma dwie kopie „org.apache.http”
YETI

1
Każdy, kto korzysta z Volleybiblioteki, pamiętaj, że to dodanie wiersza stopni powinno przejść do pliku ocen dla biblioteki, a nie do Twojej aplikacji. Działa świetnie! Wielkie dzięki!
sravan953

162

HttpClient został uznany za przestarzały na poziomie API 22 i usunięty na poziomie API 23. W dalszym ciągu można go używać na poziomie API 23 i nowszych, jeśli jest to konieczne, jednak najlepiej jest przejść na obsługiwane metody obsługi HTTP. Jeśli więc kompilujesz z 23, dodaj to do swojego build.gradle:

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

4
android { useLibrary 'org.apache.http.legacy' } [po dodaniu tego] [1] 'org.apache.http' android-studio nadal ma wskazówki: „Nie można rozwiązać symbolu” [2], dzięki czemu android-studio (z sdk23) może budować. chociaż istnieją wskazówki (nie można rozwiązać symbolu) [3], jeśli dodasz jar, nie ma żadnych wskazówek, można zbudować, ale !!! nie można uruchomić, ponieważ ma dwie kopie „org.apache.http”
YETI

1
[2.1] Zamknij więc Android Studio i uruchom go ponownie, nie otwieraj plików korzystających ze starszego kodu, a „porady” nie zostaną zastosowane. Jeśli musisz otworzyć plik, oznacza to, że masz kod, więc [4] powinieneś przestać używać HttpClient w kodzie, który kontrolujesz.
straya

Nie wiem, dlaczego (build-tool & sdk) 23 zachowuje się tak dziwacznie. Deweloper wsparcia zdarzeń nie używa własnego apche http.
YETI

1
Musisz zaktualizować Android Studio do najnowszej wersji, aby uniknąć tego zachowania ...... naprawiono go w nowej wersji
rawcoder064

Jakie są „obsługiwane metody obsługi HTTP”?
waldgeist

59

Odpowiedź TejaDroid w poniższym linku pomogła mi. Nie można zaimportować org.apache.http.HttpResponse w 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'
    ...
}

dzięki, to jedyne rozwiązanie, które działało z nowymi eksperymentalnymi kompilacjami, ponieważ useLibrary nie jest w nim rozpoznana
pt123 16.01.16

To jest rzeczywiście lepsza odpowiedź niż powyższa! Działa z nowszymi wersjami kompilatora
Matan Dahan

48

Aby użyć Apache HTTP dla SDK poziomu 23:

Najwyższy poziom 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/
    }
    ...
}

Powiadomienie ze studia Android o aktualizacji stopni:

Powiadomienie ze studia Android o aktualizacji stopni

Specyficzny dla modułu build.gradle - /app/build.gradle

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

31

Wypróbuj to działało dla mnie Dodaj tę zależność do pliku build.gradle

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

16

1- pobierz pliki jar Apache (od tej odpowiedzi) 4.5.zip plik z:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- otwórz zip skopiuj pliki jar do swojego folderu libs. Możesz go znaleźć, jeśli przejdziesz na górę projektu, gdzie jest napisane „Android”, po kliknięciu znajdziesz listę. Więc,

Android -> Projekt -> aplikacja -> biblioteki

, Następnie umieść tam słoiki.

3- W build.gradle (moduł: aplikacja) dodaj

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

w

 dependency { 
   }

4- W klasie Java dodaj te importy:

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 nie jest już obsługiwany w sdk 23. Wersja Androida 6.0 (API Level 23) usuwa obsługę klienta HTTP Apache. Musisz użyć

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

a także dodaj poniższy fragment kodu do swojej zależności:

// Ostateczne rozwiązanie http dla usługi internetowej (w tym przesyłanie plików)

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

Pomoże Ci również podczas korzystania z funkcji MultipartEntity do przesyłania plików .


Cieszę się, że to ci pomaga :)
android_sh

Mam problemy z tym ... zduplikowanym wpisem: org / apache / http / HttpHeaders.class. Czy wiesz na czym polega problem?
DaniG

7

w API 22 stają się przestarzałe, a w API 23 całkowicie je usunęły. Prostym obejściem, jeśli nie potrzebujesz wszystkich wymyślnych rzeczy z nowych dodatków, jest po prostu użycie plików .jar z apache, które zostały zintegrowane przed API 22, ale jako oddzielne pliki .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

Jeśli chcesz zaimportować niektóre klasy, takie jak:

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;

Możesz dodać następujący wiersz w build.gradle (zależności 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'

}

Idealna odpowiedź! Musiałem użyć wrapped.org.apache, ponieważ musiałem zaktualizować bardzo stary projekt. Dzięki.
dianakarenms

6

Możesz po prostu dodać to do zależności Gradle:

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

2
To pomaga. Ale wciąż nie wystarczy, jeśli chcesz użyć innych klas takich jak HttpGet. Do tego użyłemcompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro,

6

Wersja Androida 6.0 (API Level 23) usuwa obsługę klienta HTTP Apache. Dlatego nie można używać tej biblioteki bezpośrednio w API 23. Istnieje jednak sposób na jej wykorzystanie. Dodaj useLibrary „org.apache.http.legacy” w pliku build.gradle, jak poniżej-

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

Jeśli to nie zadziała, możesz zastosować następujący hack-

- Skopiuj plik org.apache.http.legacy.jar znajdujący się w katalogu / platform / android-23 / opcjonalną ścieżkę katalogu zestawu SDK systemu Android do folderu aplikacji / libs projektu.

- Teraz dodaj pliki kompilacji („libs / org.apache.http.legacy.jar”) w sekcji zależności {} pliku build.gradle.


Ostatnia podana opcja dobrze działa. Doceniam.
Joseph

5

Klient ApacheHttp został usunięty z SDK v23. Możesz użyć HttpURLConnection lub klienta HTTP innej firmy, takiego jak OkHttp.

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


Korzystanie z HttpUrlConnectionjest faktycznie zalecane zamiast HttpClient
Ben Pearson


4

HttpClient nie jest obsługiwany w SDK 23 i 23+.

Jeśli potrzebujesz użyć do SDK 23, dodaj poniższy kod do swojej klasy:

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

To działa dla mnie. Mam nadzieję, że ci się przyda.


Doskonale działał z wersją SDK 24
Daksh Mehta

4

Jeśli potrzebujesz SDK 23, dodaj to do swojej oceny:

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

4

Musisz dodać tylko jedną linię

useLibrary 'org.apache.http.legacy'

na przykład w build.gradle (moduł: aplikacja)

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

Który cel API masz w swoim projekcie? AndroidHttpClientdotyczy tylko interfejsu API poziomu 8 <. i proszę zajrzyj tutaj

baw się dobrze :)


3

Jak wspomniano wcześniej, org.apache.http.client.HttpClientnie jest już obsługiwany w:

SDK (poziom API) # 23.

Musisz użyć java.net.HttpURLConnection.

Jeśli chcesz, aby Twój kod (i życie) łatwiejsze przy użyciu HttpURLConnection, tutaj jest Wrappertej klasy, który pozwoli Ci wykonywać proste operacje z GET, POSTi PUTużywając JSON, jak na przykład robi 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()

Możesz go używać.

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

Dodaj te dwa wiersze w zależnościach

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

następnie

useLibrary 'org.apache.http.legacy'

pod Androidem


1

Innym sposobem jest posiadanie pliku httpclient.jar , możesz to zrobić:

Wklej plik .jar do „folderu libs” w swoim projekcie. Następnie stopniowo dodaj tę linię do swojego build.gradle (moduł: aplikacja)

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

Błąd: (30, 0) Nie znaleziono metody Gradle DSL: „classpath ()” Możliwe przyczyny:

  • W projekcie „cid” może być używana wersja wtyczki Android Gradle, która nie zawiera tej metody (np. W wersji 1.1.0 dodano „testCompile”). Zaktualizuj wtyczkę do wersji 2.3.3 i zsynchronizuj projekt
  • Projekt „cid” może używać wersji Gradle, która nie zawiera tej metody. Otwórz plik opakowania Gradle
  • W pliku kompilacji może brakować wtyczki Gradle. Zastosuj wtyczkę Gradle

  • 0

    Dla Androida API 28 i wyższych w Manifest.xml wewnątrz znacznika aplikacji

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

    -1

    Myślę, że w zależności od posiadanej wersji Androida Studio, ważne jest, aby zaktualizować również swoje studio Android, byłem też sfrustrowany postępowaniem zgodnie z radami wszystkich, ale bez powodzenia, dopóki nie musiałem zaktualizować mojej wersji Androida z 1.3 do 1.5, błędy zniknęły jak magia.

    Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
    Licensed under cc by-sa 3.0 with attribution required.