HttpClient tidak akan mengimpor di Android Studio


359

Saya memiliki kelas sederhana yang ditulis di Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

dan dari ini saya mendapatkan kesalahan waktu kompilasi berikut:

Cannot resolve symbol HttpClient

Tidak HttpClienttermasuk dalam Android Studio SDK? Bahkan jika tidak, saya menambahkannya ke build Gradle saya seperti ini:

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

Dengan atau tanpa baris kompilasi terakhir, kesalahannya sama. Apa yang saya lewatkan?


4
Coba gunakan AndroidHttpClientjika Anda bisa. Rintisan HttpClient memang terkandung di dalam jar android, jadi seharusnya tidak perlu merujuk secara eksplisit. Perhatikan bahwa versi android dari httpclient mungkin 4.1.1. Mencoba menggunakan versi yang lebih baru di atas yang biasanya meminta masalah (baca: tidak berfungsi, karena classloader firmware selalu menang).
dhke

Jawaban:


813

HttpClienttidak didukung lagi di SDK 23. Anda harus menggunakan URLConnectionatau menurunkan ke SDK 22 ( compile 'com.android.support:appcompat-v7:22.2.0')

Jika Anda membutuhkan SDK 23, tambahkan ini ke gradel Anda:

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

Anda juga dapat mencoba mengunduh dan memasukkan tabung HttpClient langsung ke proyek Anda atau menggunakan OkHttp sebagai gantinya


3

20
Itu tidak melakukan apa pun dalam kasus saya. Bagaimana bisa?
pengembang android

2
useLibrary tidak dapat diselesaikan ketika saya menambahkannya. Target saya adalah 23, apa yang saya lewatkan?
Badr

1
android { useLibrary 'org.apache.http.legacy' } [ketika Anda menambahkan ini] [1] 'studio-org.apache.http' android-masih memiliki tips: 'Tidak dapat menyelesaikan simbol' [2] ini dapat membangun android-studio (dengan SDK23). meskipun ada tips (Tidak dapat menyelesaikan simbol) [3] jika Anda menambahkan jar, tidak ada tips, dapat membangun, tapi !!! tidak dapat berjalan, karena memiliki dua salinan 'org.apache.http'
YETI

1
Bagi siapa pun di luar sana yang menggunakan Volleyperpustakaan, perhatikan bahwa penambahan garis gradle ini harus masuk ke file gradle untuk perpustakaan, dan bukan aplikasi Anda. Bekerja dengan sempurna! Terima kasih banyak!
sravan953

162

HttpClient sudah tidak digunakan lagi di API Level 22 dan dihapus di API Level 23. Anda masih dapat menggunakannya di API Level 23 dan seterusnya jika Anda harus, namun yang terbaik adalah beralih ke metode yang didukung untuk menangani HTTP. Jadi, jika Anda mengompilasi dengan 23, tambahkan ini di build.gradle Anda:

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

4
android { useLibrary 'org.apache.http.legacy' } [ketika Anda menambahkan ini] [1] 'studio-org.apache.http' android-masih memiliki tips: 'Tidak dapat menyelesaikan simbol' [2] ini dapat membangun android-studio (dengan SDK23). meskipun ada tips (Tidak dapat menyelesaikan simbol) [3] jika Anda menambahkan jar, tidak ada tips, dapat membangun, tapi !!! tidak dapat berjalan, karena memiliki dua salinan 'org.apache.http'
YETI

1
[2.1] Jadi tutup Android Studio dan mulai lagi, jangan buka file yang menggunakan kode lawas dan "tips" tidak akan diterapkan. Jika Anda perlu membuka file itu berarti Anda memiliki kodenya, jadi [4] Anda harus berhenti menggunakan HttpClient dalam kode yang Anda kontrol.
straya

Jangan tahu mengapa (build-tool & SDK) 23 begitu aneh. Acara donot mendukung pengembang menggunakan 'apche http' di pikiran seseorang.
YETI

1
Anda harus memperbarui studio android ke versi terbaru untuk menghindari perilaku ini ...... diperbaiki di versi baru
rawcoder064

Apa "metode yang didukung untuk menangani HTTP"?
waldgeist

59

Jawaban TejaDroid di tautan di bawah membantu saya. Tidak dapat mengimpor org.apache.http.HttpResponse di 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'
    ...
}

terima kasih ini satu-satunya solusi yang bekerja dengan eperimental builds baru karena useLibrary tidak dikenali di dalamnya
pt123

Ini sebenarnya jawaban yang lebih baik daripada yang di atas! ini bekerja dengan versi kompiler yang lebih baru
Matan Dahan

48

Untuk menggunakan Apache HTTP untuk SDK Level 23:

Build.gradle tingkat atas - /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/
    }
    ...
}

Pemberitahuan dari Android studio tentang pembaruan gradle:

Pemberitahuan dari Android studio tentang pembaruan gradle

Modul khusus build.gradle - /app/build.gradle

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

31

Coba ini berhasil untuk saya Tambahkan ketergantungan ini ke File build.gradle Anda

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

16

1- mengunduh file jar Apache (pada jawaban ini) 4.5.zip file dari:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2 - buka zip, salin file jar ke folder lib Anda. Anda dapat menemukannya jika Anda pergi ke bagian atas proyek Anda di mana dikatakan "Android" Anda akan menemukan daftar ketika Anda mengkliknya. Begitu,

Android -> Project -> app -> libs

, Lalu letakkan toples di sana.

3- Dalam build.gradle (Module: app) tambahkan

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

di

 dependency { 
   }

4- Di kelas java tambahkan impor ini:

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 tidak lagi didukung di SDK 23. Rilis Android 6.0 (API Level 23) menghilangkan dukungan untuk klien HTTP Apache. Anda harus menggunakan

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

dan juga menambahkan potongan kode di bawah ini dalam ketergantungan Anda:

// solusi akhir http untuk layanan web (termasuk mengunggah file)

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

Ini juga akan membantu Anda saat Anda menggunakan Use MultipartEntity untuk mengunggah File .


Senang mendengar bahwa ini membantu Anda :)
android_sh

Saya memiliki masalah dengan itu ... entri duplikat: org / apache / http / HttpHeaders.class. Apakah Anda tahu apa masalahnya?
DaniG

7

di API 22 mereka menjadi usang dan di API 23 mereka menghapusnya sepenuhnya, solusi sederhana jika Anda tidak memerlukan semua hal-hal mewah dari penambahan baru adalah dengan hanya menggunakan file .jar dari apache yang terintegrasi sebelum API 22, tetapi sebagai file .jar yang dipisahkan:

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

Jika Anda ingin mengimpor beberapa kelas seperti:

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;

Anda dapat menambahkan baris berikut di build.gradle (dependensi 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'

}

Jawaban sempurna! Saya harus menggunakan wrap.org.apache karena saya perlu memperbarui proyek yang sangat lama. Terima kasih.
dianakarenms

6

Anda bisa menambahkan ini ke dependensi Gradle:

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

2
Ini membantu. Tetapi masih belum cukup jika Anda ingin menggunakan kelas lain seperti HttpGet. Untuk itu saya menggunakancompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro

6

Rilis Android 6.0 (API Level 23) menghilangkan dukungan untuk klien HTTP Apache. Karenanya Anda tidak dapat menggunakan pustaka ini secara langsung di API 23. Tetapi ada cara untuk menggunakannya. Tambahkan useLibrary 'org.apache.http.legacy' di file build.gradle Anda seperti di bawah ini-

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

Jika ini tidak berhasil, Anda dapat menerapkan peretasan berikut

- Salin org.apache.http.legacy.jar yang ada di / platform / android-23 / path opsional direktori Android SDK Anda ke folder app / libs proyek Anda.

- Sekarang Tambahkan file kompilasi ('libs / org.apache.http.legacy.jar') di dalam dependensi {} bagian dari file build.gradle.


Opsi terakhir yang Anda berikan melakukan pekerjaan dengan baik. Saya menghargai.
Joseph

5

Klien ApacheHttp dihapus dalam v23 SDK. Anda dapat menggunakan HttpURLConnection atau Klien Http pihak ketiga seperti OkHttp.

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


Penggunaan HttpUrlConnectionsebenarnya dianjurkan sebagai pengganti HttpClient
Ben Pearson

4

Cukup gunakan ini: -

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

4

HttpClient tidak didukung dalam sdk 23 dan 23+.

Jika Anda perlu menggunakan ke SDK 23, tambahkan kode di bawah ini ke gradle Anda:

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

Ini bekerja untuk saya. Semoga bermanfaat buat Anda.


Bekerja dengan sempurna dengan SDK versi 24
Daksh Mehta

4

Jika Anda membutuhkan SDK 23, tambahkan ini ke gradel Anda:

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

4

Anda harus menambahkan hanya satu baris

useLibrary 'org.apache.http.legacy'

ke build.gradle (Module: app), misalnya

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

Target API mana yang Anda miliki dalam proyek Anda? AndroidHttpClienthanya untuk API Level 8 <. dan silakan lihat di sini

nikmati kode kamu :)


3

Seperti disebutkan sebelumnya, org.apache.http.client.HttpClienttidak didukung lagi di:

SDK (level API) # 23.

Anda harus menggunakan java.net.HttpURLConnection.

Jika Anda ingin membuat kode Anda (dan masa pakai) lebih mudah saat menggunakan HttpURLConnection, berikut adalah Wrapperkelas ini yang akan memungkinkan Anda melakukan operasi sederhana dengan GET, POSTdan PUTmenggunakan JSON, seperti misalnya, melakukan a 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()

Jangan ragu untuk menggunakannya.

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

Tambahkan dua baris ini di bawah dependensi

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

kemudian

useLibrary 'org.apache.http.legacy'

di bawah android


1

Cara lain adalah jika Anda memiliki file httpclient.jar maka Anda dapat melakukan ini:

Rekatkan file .jar Anda di "folder libs" di proyek Anda. Kemudian secara bertahap tambahkan baris ini di build.gradle Anda (Modul: aplikasi)

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

Kesalahan: (30, 0) Metode DSL Gradle tidak ditemukan: 'classpath ()' Kemungkinan penyebab:

  • Proyek 'cid' mungkin menggunakan versi plug-in Android Gradle yang tidak mengandung metode (mis. 'TestCompile' ditambahkan pada 1.1.0). Tingkatkan plugin ke versi 2.3.3 dan sinkronkan proyek
  • Proyek 'cid' mungkin menggunakan versi Gradle yang tidak mengandung metode ini. Buka file bungkus Gradle
  • File build mungkin kehilangan plugin Gradle. Terapkan plugin Gradle

  • 0

    Untuk android API 28 dan lebih tinggi di Manifest.xml di dalam tag aplikasi

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

    -1

    Saya pikir tergantung pada versi Android Studio yang Anda miliki, penting Anda memperbarui studio android Anda juga, saya menjadi frustrasi juga mengikuti saran semua orang tetapi tidak berhasil, sampai saya harus meng-upgrade versi android saya dari 1,3 ke 1,5, kesalahan menghilang seperti sihir.

    Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
    Licensed under cc by-sa 3.0 with attribution required.