Android Studio中无法导入HttpClient

384

我有一个在Android Studio中编写的简单类:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

我从中得到以下编译时错误:

无法解析符号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。Android版的HttpClient存根确实包含在android jar中,因此通常不需要明确引用它。请注意,android版的httpclient可能是4.1.1版本。试图在其基础上使用更新版本通常会导致问题(即:无法工作,因为固件类加载器始终获胜)。 - dhke
重复 https://dev59.com/a1wY5IYBdhLWcg3w2Kwv#32157466. - straya
25个回答

835

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 jar直接包含到您的项目中,或者使用OkHttp代替。


3
公告链接:https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client - dhke
21
在我的情况下它没有起作用。为什么? - android developer
2
当我添加useLibrary时,出现了“无法解析useLibrary”。我的目标是23,我错过了什么? - fullmoon
1
安卓 { useLibrary 'org.apache.http.legacy' }[当您添加此内容时] [1] 'org.apache.http' 安卓工作室仍然提示:'无法解析符号' [2] 这使得安卓工作室(使用sdk23)可以构建。尽管有提示(无法解析符号) [3] 如果您添加了jar,它没有提示,可以构建,但是!!!不能运行,因为它有两个副本的 'org.apache.http' - YETI
1
对于使用Volley库的任何人,请注意这个gradle行添加应该放在库的gradle文件中,而不是你的应用程序中。完美地工作!非常感谢! - sravan953
显示剩余10条评论

165

HttpClient在API Level 22中已被弃用,并在API Level 23中移除。如果必须使用它,您仍然可以在API Level 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] 这将使得使用SDK 23的Android Studio可以构建,尽管有一个提示(无法解析符号)。 [3] 如果添加jar,则没有提示,可以构建,但是不能运行,因为它有两个副本的“org.apache.http”。 - YETI
1
[2.1] 关闭Android Studio并重新启动,不要打开使用旧代码的文件,这样就不会应用“提示”。 如果需要打开该文件,则意味着您拥有该代码,因此**[4]**您应该停止在您控制的代码中使用HttpClient。 - straya
不知道为什么(build-tool&sdk)23的行为如此奇怪。即使开发者想使用'apche http',事件也不支持。 - YETI
1
你必须更新Android Studio到最新版本,以避免这种行为......在新版本中已经修复了。 - rawcoder064
如何处理HTTP的“支持方法”? - waldgeist
显示剩余4条评论

66

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

谢谢,这是唯一一个在新的实验构建中有效的解决方案,因为 useLibrary 在其中无法识别。 - pt123
这实际上比上面的答案更好!它适用于较新版本的编译器。 - Matan Dahan

47

使用 Apache HTTP 客户端库来支持 SDK Level 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'
    ...
}

34

试试这个,对我有用。将以下依赖项添加到您的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 -> Project -> app -> libs

然后将jar文件放在那里。

3- 在build.gradle(Module: app)中添加以下代码:

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

需要翻译的内容:

in

 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;

15

在sdk 23中,Android 6.0(API Level 23)已经不再支持HttpClient。Apache HTTP客户端已被移除。

您必须使用其他替代方式。

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

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

//http最终解决方案,适用于Web服务(包括文件上传)

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

10

如果你想导入一些类似于:

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'

}

完美的答案!我不得不使用wrapped.org.apache,因为我需要更新一个非常老的项目。谢谢。 - dianakarenms

7

在API 22中,它们变为不推荐使用状态,在API 23中完全移除了它们。如果您不需要新添加的所有花哨功能,一个简单的解决方法是直接使用apache的.jar文件,这些文件在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
截至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添加到您的方法中。


非常感谢。你的回答很有效。 - Ganesan J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接