HttpClient sẽ không nhập trong Android Studio


359

Tôi có một lớp đơn giản được viết trong Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

và từ đây tôi nhận được lỗi thời gian biên dịch sau:

Cannot resolve symbol HttpClient

Không HttpClientcó trong SDK Android Studio? Ngay cả khi nó không phải, tôi đã thêm nó vào bản dựng Gradle của mình như thế này:

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

Có hoặc không có dòng biên dịch cuối cùng, lỗi là như nhau. Tôi đang thiếu gì?


4
Cố gắng sử dụng AndroidHttpClientnếu bạn có thể. Các cuống httpClient thực sự được chứa trong jar Android, vì vậy không cần phải đề cập đến nó một cách rõ ràng. Lưu ý rằng phiên bản Android của httpclient có lẽ là 4.1.1. Cố gắng sử dụng một phiên bản mới hơn ở trên đó thường là vấn đề rắc rối (đọc: không hoạt động, bởi vì trình nạp lớp firmware luôn thắng).
dhke

Câu trả lời:


813

HttpClientkhông được hỗ trợ nữa trong sdk 23. Bạn phải sử dụng URLConnectionhoặc hạ cấp xuống sdk 22 (compile 'com.android.support:appcompat-v7:22.2.0' )

Nếu bạn cần sdk 23, hãy thêm nó vào lớp của bạn:

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

Bạn cũng có thể cố gắng để tải về và bao gồm HttpClient jar trực tiếp vào dự án của bạn hoặc sử dụng OkHttp thay



20
Nó không làm gì trong trường hợp của tôi. Làm thế nào mà?
nhà phát triển Android

2
sử dụng thư viện không thể được giải quyết khi tôi thêm nó. Mục tiêu của tôi là 23, tôi đang thiếu gì?
Badr

1
android { useLibrary 'org.apache.http.legacy' } [khi bạn thêm cái này] [1] 'org.apache.http' android-studio vẫn có mẹo: 'Không thể giải quyết biểu tượng' [2] điều này làm cho android-studio (với sdk23) có thể xây dựng. mặc dù có mẹo (biểu tượng không thể giải quyết) [3] nếu bạn thêm jar, nó không có mẹo, có thể xây dựng, nhưng !!! không thể chạy, vì nó có hai bản sao 'org.apache.http'
YETI

1
Đối với bất kỳ ai sử dụng Volleythư viện, hãy lưu ý rằng phần bổ sung dòng này sẽ đi vào tệp lớp cho thư viện chứ không phải ứng dụng của bạn. Hoạt động hoàn hảo! Cảm ơn rất nhiều!
sravan953

162

HttpClient không được chấp nhận trong API cấp 22 và bị xóa trong API cấp 23. Bạn vẫn có thể sử dụng nó trong API cấp 23 trở đi nếu bạn phải, tuy nhiên, tốt nhất là chuyển sang các phương thức được hỗ trợ để xử lý HTTP. Vì vậy, nếu bạn đang biên dịch với 23, hãy thêm phần này vào build.gradle của bạn:

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

4
android { useLibrary 'org.apache.http.legacy' } [khi bạn thêm cái này] [1] 'org.apache.http' android-studio vẫn có mẹo: 'Không thể giải quyết biểu tượng' [2] điều này làm cho android-studio (với sdk23) có thể xây dựng. mặc dù có mẹo (Biểu tượng không thể giải quyết) [3] nếu bạn thêm jar, nó không có mẹo, có thể xây dựng, nhưng !!! không thể chạy, vì nó có hai bản sao 'org.apache.http'
YETI

1
[2.1] Vì vậy, hãy đóng Android Studio và khởi động lại, không mở (các) tệp sử dụng mã kế thừa và "mẹo" sẽ không được áp dụng. Nếu bạn cần mở tệp thì nó gợi ý bạn sở hữu mã, vì vậy [4] bạn nên ngừng sử dụng HttpClient trong mã bạn kiểm soát.
straya

Donot biết tại sao (công cụ xây dựng & sdk) 23 hành vi kỳ dị như vậy. Nhà phát triển hỗ trợ sự kiện donot sử dụng 'apche http' trong tâm trí của một người.
YETI

1
Bạn phải cập nhật studio android lên phiên bản mới nhất để tránh hành vi này ...... nó đã được sửa trong phiên bản mới
rawcoder064

"Các phương thức được hỗ trợ để xử lý HTTP" là gì?
waldgeist

59

Câu trả lời của TejaDroid trong liên kết dưới đây đã giúp tôi. Không thể nhập org.apache.http.HttpResponse trong 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'
    ...
}

cảm ơn, đây là giải pháp duy nhất hoạt động với các bản dựng eperimental mới vì useL Library không được công nhận trong đó
pt123

Đây thực sự là một câu trả lời tốt hơn so với câu hỏi trên! nó hoạt động với các phiên bản mới hơn của trình biên dịch
Matan Dahan

48

Để sử dụng Apache HTTP cho SDK Cấp 23:

Xây dựng cấp cao nhất.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/
    }
    ...
}

Thông báo từ studio Android về cập nhật lớp:

Thông báo từ studio Android về cập nhật gradle

Mô-đun xây dựng cụ thể.gradle - /app/build.gradle

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

31

Hãy thử điều này làm việc cho tôi Thêm phụ thuộc này vào tệp build.gradle của bạn

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

16

1- tải xuống các tệp jar Apache (theo câu trả lời này) tệp 4.5.zip từ:
https://hc.apache.org/doads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- mở zip sao chép các tệp jar vào thư mục libs của bạn. Bạn có thể tìm thấy nó nếu bạn đi đến đầu dự án của bạn với thông báo "Android" bạn sẽ tìm thấy một danh sách khi bạn nhấp vào nó. Vì thế,

Android -> Dự án -> ứng dụng -> libs

, Sau đó đặt lọ ở đó.

3- Trong build.gradle (Module: ứng dụng) thêm

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

trong

 dependency { 
   }

4 - Trong lớp java thêm các nhập khẩu này:

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 không được hỗ trợ nữa trong sdk 23. Bản phát hành Android 6.0 (API cấp 23) loại bỏ hỗ trợ cho máy khách HTTP Apache. Bạn phải sử dụng

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

và cũng thêm đoạn mã dưới đây vào phần phụ thuộc của bạn:

// http giải pháp cuối cùng cho dịch vụ web (bao gồm tải lên tệp)

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

Nó cũng sẽ giúp bạn trong khi bạn sử dụng Sử dụng MultipartEntity để tải lên Tệp .


Rất vui khi biết rằng nó giúp bạn :)
android_sh

Tôi có vấn đề với ... mục nhập trùng lặp: org / apache / http / httpHeaders. Class. Bạn có biết vấn đề là gì không?
DaniG

7

trong API 22 chúng bị phản đối và trong API 23, chúng đã loại bỏ chúng hoàn toàn, một cách giải quyết đơn giản nếu bạn không cần tất cả những thứ ưa thích từ các bổ sung mới là chỉ cần sử dụng các tệp .jar từ apache được tích hợp trước API 22, nhưng như các tệp .jar riêng biệt:

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

Nếu bạn muốn nhập một số lớp như:

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;

Bạn có thể thêm dòng sau vào build.gradle (Gradle phụ thuộc)

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'

}

Câu trả lời hoàn hảo! Tôi đã phải sử dụng Wra.org.apache vì tôi cần cập nhật một dự án rất cũ. Cảm ơn.
dianakarenms

6

Bạn chỉ có thể thêm phần này vào các phụ thuộc Gradle:

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

2
Điều này có ích. Nhưng vẫn chưa đủ nếu bạn muốn sử dụng các lớp khác như thế nào HttpGet. Tôi đã sử dụngcompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro

6

Bản phát hành Android 6.0 (API cấp 23) loại bỏ hỗ trợ cho máy khách HTTP Apache. Do đó, bạn không thể sử dụng thư viện này trực tiếp trong API 23. Nhưng có một cách để sử dụng nó. Thêm useL Library 'org.apache.http.legacy' trong tệp build.gradle của bạn như dưới đây-

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

Nếu điều này không hiệu quả, bạn có thể áp dụng cách hack sau-

- Sao chép org.apache.http.legacy.jar có trong / platform / android-23 / đường dẫn tùy chọn của thư mục SDK Android của bạn vào thư mục ứng dụng / libs của dự án.

- Bây giờ Thêm tệp biên dịch ('libs / org.apache.http.legacy.jar') bên trong phần phụ thuộc {} của tệp build.gradle.


Tùy chọn cuối cùng bạn đưa ra làm công việc tốt. Tôi đánh giá cao.
Giuse

5

Máy khách ApacheHttp bị xóa trong sdk v23. Bạn có thể sử dụng httpURLCconnectection hoặc Máy khách http của bên thứ ba như OkHttp.

tham chiếu: https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client


Việc sử dụng HttpUrlConnectionthực sự được khuyến khích thay cho HTTPClient
Ben Pearson

4

Chỉ cần sử dụng cái này: -

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

4

HttpClient không được hỗ trợ trong sdk 23 và 23+.

Nếu bạn cần sử dụng vào sdk 23, hãy thêm mã dưới đây vào lớp của bạn:

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

Nó làm việc cho tôi. Hy vọng hữu ích cho bạn.


Hoạt động hoàn hảo với SDK phiên bản 24
Daksh Mehta

4

Nếu bạn cần sdk 23, hãy thêm nó vào lớp của bạn:

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

4

Bạn phải thêm chỉ một dòng

useLibrary 'org.apache.http.legacy'

vào build.gradle (Module: ứng dụng), ví dụ

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

Bạn có mục tiêu API nào trong dự án của mình? AndroidHttpClientchỉ dành cho API cấp 8 <. và xin vui lòng xem tại đây

thưởng thức mã của bạn :)


3

Như đã đề cập trước đó, org.apache.http.client.HttpClientkhông được hỗ trợ nữa trong:

SDK (cấp API) # 23.

Bạn phải sử dụng java.net.HttpURLConnection.

Nếu bạn muốn làm cho mã của bạn (và cuộc sống) dễ dàng hơn khi sử dụng HttpURLConnection, đây là một Wrapperlớp học này sẽ cho phép bạn làm thao tác đơn giản với GET, POSTPUTsử dụng JSON, ví dụ như, làm một 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()

Hãy sử dụng nó.

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

Thêm hai dòng này dưới sự phụ thuộc

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

sau đó

useLibrary 'org.apache.http.legacy'

dưới Android


1

Một cách khác là nếu bạn có tệp httpclient.jar thì bạn có thể làm điều này:

Dán tệp .jar của bạn vào "thư mục libs" trong dự án của bạn. Sau đó, trong lớp, thêm dòng này vào build.gradle (Module: ứng dụng)

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

Lỗi: (30, 0) Không tìm thấy phương thức DSL cấp: 'classpath ()' Nguyên nhân có thể:

  • Dự án 'cid' có thể đang sử dụng một phiên bản của trình cắm Android Gradle không chứa phương thức (ví dụ: 'testCompile' đã được thêm vào 1.1.0). Nâng cấp plugin lên phiên bản 2.3.3 và dự án đồng bộ hóa
  • Dự án 'cid' có thể đang sử dụng phiên bản Gradle không chứa phương thức. Mở tệp bao bọc Gradle
  • Tệp xây dựng có thể thiếu plugin Gradle. Áp dụng plugin Gradle

  • 0

    Đối với API Android 28 trở lên trong Manifest.xml bên trong thẻ ứng dụng

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

    -1

    Tôi nghĩ tùy thuộc vào phiên bản Android Studio của bạn, điều quan trọng là bạn cũng cập nhật phòng thu Android của mình, tôi cũng cảm thấy thất vọng vì lời khuyên của mọi người nhưng không may mắn, cho đến khi tôi phải nâng cấp phiên bản Android của mình từ 1.3 lên 1.5, các lỗi đã biến mất như ma thuật.

    Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
    Licensed under cc by-sa 3.0 with attribution required.