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?

AndroidDev
sumber
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

Ilya Blokh
sumber
3
Tautan pengumuman: developer.android.com/preview/…
dhke
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'
}
straya
sumber
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'
    ...
}
Vinay
sumber
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'
    ...
}
AndreyICE
sumber
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'
Pritish Joshi
sumber
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;
Badr
sumber
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 .

android_sh
sumber
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
Catalin
sumber
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'

}
A.Bahrami
sumber
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"
Mostafa Abdellateef
sumber
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.

pengguna3766643
sumber
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

Kirtan
sumber
Penggunaan HttpUrlConnectionsebenarnya dianjurkan sebagai pengganti HttpClient
Ben Pearson
4

Cukup gunakan ini: -

android {
         .
         .
         .
 useLibrary 'org.apache.http.legacy'
         .
         .
         .
          }
Kaushal Kishor
sumber
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.

Sneha Patel
sumber
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'
}
Shiv Buyya
sumber
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'
}
Nilesh Panchal
sumber
3

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

nikmati kode kamu :)

John Smith
sumber
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;
    }

}
Alejandro Pablo Tkachuk
sumber
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

Ramindu Rusara Senarath
sumber
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')
}
Pre_hacker
sumber
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
  • Eshan Chattaraj
    sumber
    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"/>
    Wowo Ot
    sumber
    -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.

    steven89806
    sumber