HttpClient จะไม่นำเข้าใน Android Studio


359

ฉันมีคลาสง่ายๆที่เขียนใน Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

และจากนี้ฉันได้รับข้อผิดพลาดเวลารวบรวมต่อไปนี้:

Cannot resolve symbol HttpClient

ไม่HttpClientรวมอยู่ใน Android Studio SDK? แม้ว่าจะไม่ใช่ฉันก็เพิ่มมันลงใน Gradle build ของฉันเช่นนี้:

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

มีหรือไม่มีบรรทัดรวบรวมล่าสุดข้อผิดพลาดจะเหมือนกัน ฉันกำลังคิดถึงอะไร


4
ลองใช้AndroidHttpClientถ้าคุณสามารถ HttpClient stubs นั้นมีอยู่ใน android jar ดังนั้นไม่จำเป็นต้องอ้างถึงอย่างชัดเจน โปรดทราบว่า Android เวอร์ชัน httpclient น่าจะเป็น 4.1.1 การพยายามใช้รุ่นที่ใหม่กว่านั้นมักจะถามถึงปัญหา (อ่าน: ไม่ได้ผลเพราะเฟิร์มแวร์ตัวโหลดคลาสชนะเสมอ)
dhke

คำตอบ:


813

HttpClientไม่รองรับอะไรเพิ่มเติมใน sdk 23 คุณต้องใช้URLConnectionหรือลดระดับเป็น sdk 22 ( compile 'com.android.support:appcompat-v7:22.2.0')

หากคุณต้องการ sdk 23 ให้เพิ่มสิ่งนี้ลงใน gradle ของคุณ:

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

คุณอาจลองดาวน์โหลดและใส่โถ HttpClientลงในโครงการของคุณโดยตรงหรือใช้OkHttpแทน


3
ลิงค์ประกาศ: developer.android.com/preview/…
dhke

20
มันไม่ได้ทำอะไรเลยในกรณีของฉัน มาทำไม
นักพัฒนา android

2
useLibrary ไม่สามารถแก้ไขได้เมื่อฉันเพิ่ม เป้าหมายของฉันคือ 23 ฉันจะพลาดอะไรไป
Badr

1
android { useLibrary 'org.apache.http.legacy' } [เมื่อคุณเพิ่มสิ่งนี้] [1] 'org.apache.http' android-studio ยังมีเคล็ดลับ: 'ไม่สามารถแก้ไขสัญลักษณ์' [2]สิ่งนี้ทำให้ android-studio (มี sdk23) สามารถสร้างได้ แม้ว่าจะมีเคล็ดลับ (ไม่สามารถแก้ปัญหาสัญลักษณ์) [3]ถ้าหากคุณเพิ่ม jar ก็ไม่มีคำแนะนำสามารถสร้างได้ แต่ !!! ไม่สามารถรันได้เนื่องจากมีสำเนา 'org.apache.http' สองชุด
YETI

1
สำหรับใครก็ตามที่ใช้Volleyห้องสมุดโปรดทราบว่าการเพิ่มบรรทัดการไล่ระดับสีนี้ควรไปที่ไฟล์ gradle สำหรับไลบรารีไม่ใช่แอปของคุณ ทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณตัน!
sravan953

162

HttpClient เลิกใช้แล้วใน API ระดับ 22 และลบออกใน API ระดับ 23 คุณยังสามารถใช้งานได้ใน API ระดับ 23 ขึ้นไปหากคุณต้องใช้อย่างไรก็ตามวิธีที่ดีที่สุดคือย้ายไปยังวิธีที่รองรับเพื่อจัดการกับ HTTP ดังนั้นถ้าคุณกำลังคอมไพล์ด้วย 23 ให้เพิ่มอันนี้ใน build.gradle

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

4
android { useLibrary 'org.apache.http.legacy' } [เมื่อคุณเพิ่มสิ่งนี้] [1] 'org.apache.http' android-studio ยังมีเคล็ดลับ: 'ไม่สามารถแก้ไขสัญลักษณ์' [2]สิ่งนี้ทำให้ android-studio (มี sdk23) สามารถสร้างได้ แม้ว่าจะมีเคล็ดลับ (ไม่สามารถแก้ปัญหาสัญลักษณ์) [3]ถ้าหากคุณเพิ่ม jar ก็ไม่มีคำแนะนำสามารถสร้างได้ แต่ !!! ไม่สามารถรันได้เนื่องจากมีสำเนา 'org.apache.http' สองชุด
YETI

1
[2.1]ให้ปิด Android Studio และเริ่มใหม่อีกครั้งอย่าเปิดไฟล์ที่ใช้รหัสดั้งเดิมและจะไม่ใช้ "เคล็ดลับ" ถ้าคุณต้องการเปิดไฟล์มันจะแนะนำให้คุณเป็นเจ้าของรหัสดังนั้น[4]คุณควรหยุดใช้ HttpClient ในรหัสที่คุณควบคุม
straya

Donot รู้ว่าทำไม (build-tool & sdk) ยุค 23 เป็นบ้า นักพัฒนาที่สนับสนุนกิจกรรม donot ใช้ 'apche http' ในใจ
YETI

1
คุณต้องอัปเดต android studio เป็นเวอร์ชันล่าสุดเพื่อหลีกเลี่ยงพฤติกรรมนี้ ...... มันได้รับการแก้ไขในเวอร์ชั่นใหม่
rawcoder064

"วิธีการที่รองรับเพื่อจัดการ HTTP" คืออะไร?
เล่นแร่แปรธาตุ

59

คำตอบของ TejaDroid ในลิงค์ด้านล่างช่วยฉันได้ ไม่สามารถนำเข้า org.apache.http.HttpResponse ใน 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'
    ...
}

ขอบคุณนี่เป็นทางออกเดียวที่ทำงานกับ eperimental builds ใหม่เนื่องจาก useLibrary ไม่เป็นที่รู้จัก
pt123

นี่เป็นคำตอบที่ดีกว่าคำตอบข้างต้น! มันใช้งานได้กับคอมไพเลอร์เวอร์ชั่นใหม่กว่า
Matan Dahan

48

วิธีใช้ Apache HTTP สำหรับ SDK ระดับ 23:

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

การแจ้งเตือนจาก Android studio เกี่ยวกับการอัพเดท gradle:

การแจ้งเตือนจากสตูดิโอ Android เกี่ยวกับการอัพเดทระดับ

โมดูล build.gradle ที่เฉพาะเจาะจง - /app/build.gradle

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

31

ลองใช้วิธีนี้ได้ผลกับฉันเพิ่มการพึ่งพานี้ไปยังไฟล์ build.gradle ของคุณ

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

16

1- ดาวน์โหลดไฟล์ Apache jar (ตามคำตอบนี้) ไฟล์ 4.5.zip จาก:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- เปิด zip คัดลอกไฟล์ jar ลงในโฟลเดอร์ libs ของคุณ คุณสามารถค้นหาได้ถ้าคุณไปที่ด้านบนสุดของโครงการที่มีคำว่า "Android" คุณจะพบรายการเมื่อคุณคลิก ดังนั้น,

Android -> โครงการ -> แอพ -> libs

จากนั้นใส่ขวดที่นั่น

3- ใน build.gradle (โมดูล: แอป) เพิ่ม

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

ใน

 dependency { 
   }

4- ในคลาส java เพิ่มการนำเข้าเหล่านี้:

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 ไม่รองรับ sdk 23 อีกต่อไปการเปิดตัว Android 6.0 (API ระดับ 23) จะเป็นการลบการสนับสนุนไคลเอ็นต์ Apache HTTP คุณต้องใช้

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

และเพิ่มข้อมูลโค้ดด้านล่างในการพึ่งพาของคุณ:

// http โซลูชั่นสุดท้ายสำหรับบริการบนเว็บ (รวมถึงการอัปโหลดไฟล์)

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

นอกจากนี้ยังจะช่วยให้คุณในขณะที่คุณใช้ใช้MultipartEntityสำหรับการอัปโหลดไฟล์


ดีใจที่ได้ยินว่ามันช่วยคุณได้ :)
android_sh

ฉันมีปัญหากับ ... รายการซ้ำซ้อน: org / apache / http / HttpHeaders.class คุณรู้หรือไม่ว่ามีปัญหาอะไร
DaniG

7

ใน API 22 พวกเขาเลิกใช้แล้วและใน API 23 พวกเขานำออกมาอย่างสมบูรณ์วิธีแก้ปัญหาง่ายๆหากคุณไม่ต้องการสิ่งแปลกใหม่จากการเพิ่มใหม่คือการใช้ไฟล์. jar จาก apache ที่รวมอยู่ก่อน API 22 แต่ แยกเป็นไฟล์. 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

หากคุณต้องการนำเข้าบางคลาสเช่น:

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;

คุณสามารถเพิ่มบรรทัดต่อไปนี้ใน build.gradle (Gradle dependencies)

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'

}

คำตอบที่สมบูรณ์แบบ! ฉันต้องใช้ wra.org.apache เนื่องจากฉันต้องการอัปเดตโครงการเก่ามาก ขอบคุณ
dianakarenms

6

คุณสามารถเพิ่มสิ่งนี้ลงในการพึ่งพา Gradle:

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

2
สิ่งนี้ช่วยได้ แต่ก็ยังไม่เพียงพอหากคุณต้องการที่จะใช้เรียนอื่น ๆ HttpGetเช่น สำหรับสิ่งที่ฉันใช้compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro

6

การเปิดตัว Android 6.0 (API ระดับ 23) จะลบการสนับสนุนไคลเอ็นต์ Apache HTTP ดังนั้นคุณไม่สามารถใช้ไลบรารีนี้โดยตรงใน API 23 แต่มีวิธีการใช้งาน เพิ่ม useLibrary 'org.apache.http.legacy' ในไฟล์ build.gradle ของคุณดังต่อไปนี้ -

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

หากนี่ไม่ได้ผลคุณอาจใช้แฮ็คต่อไปนี้

- คัดลอก org.apache.http.legacy.jar ซึ่งอยู่ใน / platforms / android-23 / เส้นทางเสริมของไดเรกทอรี Android SDK ของคุณไปยังโฟลเดอร์ app / libs ของโครงการ

- ตอนนี้เพิ่มไฟล์คอมไพล์ ('libs / org.apache.http.legacy.jar') ในส่วนการพึ่งพา {} ของไฟล์ build.gradle


ตัวเลือกสุดท้ายที่คุณให้ทำงานได้ดี ข้าพเจ้าซาบซึ้ง.
โจเซฟ

5

ApacheHttp Client ถูกลบใน v23 sdk คุณสามารถใช้ HttpURLConnection หรือไคลเอนต์ Http บุคคลที่สามเช่น OkHttp

อ้างอิง: https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client


มีการสนับสนุนการใช้งานHttpUrlConnectionจริงแทน HttpClient
Ben Pearson


4

HttpClient ไม่รองรับใน sdk 23 และ 23+

หากคุณต้องการใช้เป็น sdk 23 ให้เพิ่มโค้ดด้านล่างลงในระดับเสียงของคุณ:

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

มันใช้งานได้สำหรับฉัน หวังว่ามีประโยชน์สำหรับคุณ


ทำงานอย่างสมบูรณ์แบบด้วย SDK เวอร์ชัน 24
Daksh Mehta


4

คุณต้องเพิ่มเพียงหนึ่งบรรทัด

useLibrary 'org.apache.http.legacy'

ยกตัวอย่างเช่น build.gradle (Module: app)

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

ดังที่ได้กล่าวมาก่อน org.apache.http.client.HttpClientนี้ไม่ได้รับการสนับสนุนเพิ่มเติมใน:

SDK (ระดับ API) # 23

คุณต้องใช้ java.net.HttpURLConnectionคุณต้องใช้

หากคุณต้องการที่จะทำให้รหัสของคุณ (และชีวิต) ได้ง่ายขึ้นเมื่อใช้HttpURLConnectionที่นี่เป็นWrapperของชั้นนี้ที่จะช่วยให้คุณทำการดำเนินงานที่เรียบง่ายด้วยGET, POSTและPUTใช้เช่นตัวอย่างเช่นการทำJSONHTTP 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()

รู้สึกอิสระที่จะใช้มัน

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

เพิ่มสองบรรทัดนี้ภายใต้การพึ่งพา

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

แล้วก็

useLibrary 'org.apache.http.legacy'

ภายใต้ Android


1

อีกวิธีคือถ้าคุณมีไฟล์httpclient.jarคุณสามารถทำสิ่งนี้ได้:

วางไฟล์. jar ของคุณใน "โฟลเดอร์ libs" ในโครงการของคุณ จากนั้นใน gradle ให้เพิ่มบรรทัดนี้ใน build.gradle ของคุณ (โมดูล: แอป)

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

ข้อผิดพลาด: (30, 0) ไม่พบวิธีการ Gradle DSL: 'classpath ()' สาเหตุที่เป็นไปได้:

  • โปรเจ็กต์ 'cid' อาจใช้เวอร์ชันของ Android Gradle plug-in ที่ไม่มีเมธอด (เช่น 'testCompile' ถูกเพิ่มใน 1.1.0) อัปเกรดปลั๊กอินเป็นเวอร์ชัน 2.3.3 และซิงค์โครงการ
  • โครงการ 'cid' อาจใช้ Gradle รุ่นที่ไม่มีวิธีการ เปิดไฟล์แรปเปอร์ Gradle
  • ไฟล์บิลด์อาจไม่มีปลั๊กอิน Gradle ใช้ Gradle plugin

  • 0

    สำหรับ android API 28 และสูงกว่าใน Manifest.xml ภายในแท็กแอปพลิเคชัน

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

    -1

    ฉันคิดว่าขึ้นอยู่กับเวอร์ชั่น Android Studio ที่คุณมีอยู่มันสำคัญที่คุณต้องอัปเดตสตูดิโอ Android ของคุณด้วยเช่นกันฉันรู้สึกหงุดหงิดเช่นกันตามคำแนะนำของทุกคน แต่ไม่มีโชคจนกระทั่งฉันต้องอัพเกรด Android เวอร์ชัน 1.3-1.5 ข้อผิดพลาดหายไปเช่น มายากล.

    โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
    Licensed under cc by-sa 3.0 with attribution required.