HttpClient 无法在 Android Studio 中导入

HttpClient won't import in Android Studio

提问人:AndroidDev 提问时间:8/22/2015 最后编辑:Zoe is on strikeAndroidDev 更新时间:2/11/2023 访问量:626653

问:

我有一个简单的类是用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

Android Studio SDK 中不包含哪些内容?即使不是,我也会像这样将它添加到我的 Gradle 构建中:HttpClient

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

无论有没有最后一个编译行,错误都是一样的。我错过了什么?

android gradle android-gradle-plugin apache-httpclient-4.x

评论

4赞 dhke 8/22/2015
如果可以的话,尽量使用。HttpClient 存根确实包含在 android jar 中,因此无需显式引用它。请注意,httpclient 的 android 版本可能是 4.1.1。尝试在此基础上使用较新的版本通常会带来麻烦(阅读:不起作用,因为固件类加载器总是获胜)。AndroidHttpClient
0赞 straya 1/3/2020
stackoverflow.com/a/32157466/1085264 的副本

答:

835赞 Ilya Blokh 8/22/2015 #1

HttpClient在 SDK 23 中不再受支持。您必须使用或降级到 SDK 22 (URLConnectioncompile 'com.android.support:appcompat-v7:22.2.0')

如果您需要 SDK 23,请将以下内容添加到您的 gradle 中:

android {
    useLibrary("org.apache.http.legacy")
}

您也可以尝试将 HttpClient jar 直接下载并包含在您的项目中,或者改用 OkHttp

评论

3赞 dhke 8/22/2015
公告链接:developer.android.com/preview/...
21赞 android developer 9/3/2015
在我的情况下,它什么也做不了。怎么会这样?
2赞 fullmoon 9/8/2015
useLibrary 添加时无法解析。我的目标是23岁,我错过了什么?
1赞 YETI 9/16/2015
android { useLibrary 'org.apache.http.legacy' } [当你添加这个] [1] 'org.apache.http' android-studio 仍然有提示:“无法解析符号” [2] 这个使 android-studio(使用 sdk23) 可以构建。虽然有提示(无法解析符号)[3],如果你添加jar,它没有提示,可以构建,但是!!无法运行,因为它有两个副本“org.apache.http”
1赞 sravan953 1/19/2016
对于使用该库的任何人,请注意,此 gradle 行添加应该进入库的 gradle 文件,而不是您的应用程序。非常感谢!Volley
3赞 John smith 8/22/2015 #2

您的项目中具有哪个 API 目标?仅适用于 API 级别 8 <。 请看这里AndroidHttpClient

享受您的代码:)

5赞 Kirtan 8/22/2015 #3

ApacheHttp 客户端已在 v23 sdk 中删除。您可以使用 HttpURLConnection 或第三方 Http 客户端(如 OkHttp)。

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

评论

0赞 Ben Pearson 10/1/2015
实际上鼓励使用 HttpClient 来代替HttpUrlConnection
165赞 straya 8/22/2015 #4

HttpClient 在 API 级别 22 中已弃用,并在 API 级别 23 中删除。如果必须,您仍然可以在 API 级别 23 及更高版本中使用它,但最好迁移到受支持的方法来处理 HTTP。因此,如果您使用 23 进行编译,请在 build.gradle 中添加以下内容:

android {
    useLibrary("org.apache.http.legacy")
}

评论

4赞 YETI 9/16/2015
android { useLibrary 'org.apache.http.legacy' } [当你添加这个] [1] 'org.apache.http' android-studio 仍然有提示:“无法解析符号” [2] 这个使 android-studio(使用 sdk23) 可以构建。虽然有提示(无法解析符号)[3],如果你添加jar,它没有提示,可以构建,但是!!无法运行,因为它有两个副本“org.apache.http”
1赞 straya 9/17/2015
[2.1] 因此,请关闭 Android Studio 并重新启动它,不要打开使用旧代码的文件,并且不会应用“提示”。如果你需要打开这个文件,那么它表明你拥有这个代码,所以 [4] 你应该停止在你控制的代码中使用 HttpClient。
0赞 YETI 9/17/2015
不知道为什么 (build-tool&sdk)23 的行为如此怪异。事件不支持开发人员在脑海中使用“apche http”。
1赞 rawcoder064 10/26/2015
您必须将 android studio 更新到最新版本才能避免此行为......它在新版本中已修复
0赞 waldgeist 7/3/2019
什么是“支持处理 HTTP 的方法”?
16赞 fullmoon 9/8/2015 #5

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 -> 项目 -> 应用程序 -> 库

,然后把罐子放在那里。

3- 在 build.gradle (模块: app) 中添加

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;
47赞 AndreyICE 9/17/2015 #6

要将 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 更新的通知:

Notification from Android studio about gradle update

特定于模块的 build.gradle - /app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}
7赞 Catalin 9/18/2015 #7

在 API 22 中,它们被弃用,在 API 23 中,它们完全删除了它们,如果您不需要新添加的所有花哨的东西,一个简单的解决方法是简单地使用 Apache 中在 API 22 之前集成的 .jar 文件,但作为单独的 .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
6赞 Mostafa Abdellateef 9/28/2015 #8

您可以简单地将其添加到 Gradle 依赖项中:

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

评论

2赞 AlexAndro 10/5/2015
这很有帮助。但是,如果您想使用其他类,例如 .为此,我使用了HttpGetcompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
66赞 Vinay 10/29/2015 #9

TejaDroid 在下面链接中的回答帮助了我。无法在 Android Studio 中导入 org.apache.http.HttpResponse

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

评论

0赞 pt123 1/16/2016
谢谢,这是唯一适用于新体验构建的解决方案,因为其中无法识别 useLibrary
0赞 Matan Dahan 5/30/2016
这其实是比上面更好的答案!它适用于较新版本的编译器
2赞 Pre_hacker 12/7/2015 #10

另一种方法是,如果你有httpclient.jar文件,那么你可以做 这:

将 .jar 文件粘贴到项目的“libs 文件夹”中。然后在 gradle 中将这一行添加到您的 build.gradle(Module:app) 中

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.0'
compile files('libs/httpcore-4.3.3.jar')
}
34赞 Pritish Joshi 12/12/2015 #11

试试这个 为我工作 将此依赖项添加到 build.gradle 文件中

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
6赞 user3766643 12/24/2015 #12

Android 6.0(API 级别 23)版本移除了对 Apache HTTP 客户端的支持。因此,您不能在 API 23 中直接使用此库。但是有一种方法可以使用它。在 build.gradle 文件中添加 useLibrary 'org.apache.http.legacy',如下所示 -

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

如果这不起作用,您可以应用以下技巧 -

– 将 Android SDK 目录的 /platforms/android-23/optional 路径中的 org.apache.http.legacy.jar 复制到项目的 app/libs 文件夹。

– 现在在 build.gradle 文件的 dependencies{} 部分中添加编译文件('libs/org.apache.http.legacy.jar')。

评论

0赞 Joseph 8/22/2017
您给出的最后一个选项可以很好地完成这项工作。我很感激。
4赞 Kaushal Kishor 12/29/2015 #13

只需使用这个:-

android {
         .
         .
         .
 useLibrary 'org.apache.http.legacy'
         .
         .
         .
          }
15赞 android_sh 2/18/2016 #14

SDK 23 中不再支持 HttpClient。Android 6.0(API 级别 23)版本移除了对 Apache HTTP 客户端的支持。 你必须使用

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

并在您的依赖项中添加以下代码片段:

Web 服务的 HTTP 最终解决方案(包括文件上传)

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

当您使用 MultipartEntity 进行文件上传时,它还将为您提供帮助。

评论

0赞 android_sh 5/18/2016
很高兴听到它可以帮助您:)
0赞 DaniG 11/22/2016
我有问题......重复条目:org/apache/http/HttpHeaders.class。你知道问题出在哪里吗?
-1赞 steven89806 3/14/2016 #15

我认为根据您拥有的 Android Studio 版本,更新您的 android studio 也很重要,我也听从了每个人的建议感到沮丧,但没有运气,直到我不得不将我的 android 版本从 1.3 升级到 1.5,错误像魔术一样消失了。

4赞 Sneha Patel 7/11/2016 #16

SDK 23 和 23+ 不支持 HttpClient。

如果您需要在 sdk 23 中使用,请在 gradle 中添加以下代码:

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

它对我有用。希望对你有用。

评论

0赞 Daksh Mehta 6/7/2017
与 SDK 版本 24 完美配合
4赞 Shiv Buyya 7/12/2016 #17

如果您需要 sdk 23,请将其添加到您的 gradle 中:

android {
    useLibrary 'org.apache.http.legacy'
}
2赞 Ramindu Rusara Senarath 11/19/2016 #18

在依赖项下添加这两行

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

然后

useLibrary 'org.apache.http.legacy'

在Android下

5赞 Nilesh 12/3/2016 #19

您只需要添加一行

useLibrary 'org.apache.http.legacy'

into 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'
}
4赞 Alejandro Pablo Tkachuk 6/9/2017 #20

如前所述,在以下方面不再受支持:org.apache.http.client.HttpClient

SDK(API 级别)#23。

您必须使用 .java.net.HttpURLConnection

如果你想让你的代码(和生活)在使用 时更容易,这里有一个这样的类,可以让你对 进行简单的操作,并使用 ,例如,做一个 .HttpURLConnectionWrapperGETPOSTPUTJSONHTTP 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;
    }

}
0赞 Eshan Chattaraj 8/30/2017 #21

错误:(30, 0) 找不到 Gradle DSL 方法:“classpath()” 可能原因:

  • 项目“cid”可能使用的 Android Gradle 插件版本不包含该方法(例如,在 1.1.0 中添加了“testCompile”)。 将插件升级到版本 2.3.3 并同步项目
  • 项目“cid”可能使用了不包含该方法的 Gradle 版本。 打开 Gradle 包装器文件
  • 构建文件可能缺少 Gradle 插件。 应用 Gradle 插件
  • 10赞 A.Bahrami 9/30/2018 #22

    如果你想导入一些类,比如:

    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 {
        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'
    
    }
    

    评论

    0赞 dianakarenms 10/21/2018
    完美的答案!我不得不使用 wrapped.org.apache,因为我需要更新一个非常旧的项目。谢谢。
    0赞 Wowo Ot 3/18/2020 #23

    适用于 Android API 28 及更高版本 在应用程序标记内的清单 .xml 中

        <application
        .
        .
        .
    
        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    
    7赞 Will Buffington 4/6/2021 #24

    自 2021 年 4 月起,您可以使用以下内容:

    在您的应用 gradle 中,在 'dependencies { ' 下添加以下内容:

    implementation 'org.apache.httpcomponents:httpcore:4.4.10'
    implementation 'org.apache.httpcomponents:httpclient:4.5.6'
    

    在 Java 活动中,添加以下导入:

    import org.apache.http.client.HttpClient;
    

    然后,您应该能够将 HttpClient 添加到您的方法中。

    评论

    0赞 Ganesan J 7/22/2023
    非常感谢。你的答案很好用。
    0赞 Santosh b 2/9/2023 #25

    我遇到了同样的问题,我删除了httpcclient库并添加了下面提到的行,然后它开始工作。这个库似乎里面有 httpclient 类包装器。

    implementation("net.sourceforge.htmlunit:htmlunit-android:2.63.0")