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

HttpClientAndroid Studio SDKに含まれていませんか?そうでない場合でも、次のようにGradleビルドに追加しました。

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スタブは確かにandroid jar内に含まれているため、明示的に参照する必要はありません。httpclientのAndroidバージョンはおそらく4.1.1であることに注意してください。その上で新しいバージョンを使用しようとすると、通常は問題が発生します(読み取り:ファームウェアクラスローダーが常に優先されるため、機能しません)。
dhke 2015

回答:


813

HttpClientSDK 23ではサポートされなくなりました。SDK22 URLConnectioncompile 'com.android.support:appcompat-v7:22.2.0')を使用またはダウングレードする必要があります

SDK 23が必要な場合は、これをGradleに追加します。

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

プロジェクトに直接HttpClient jarをダウンロードして含めるか、代わりに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を追加した場合、ヒントはなく、ビルドできますが、実行できません。2つのコピー 'org.apache.http'があるためです
YETI

1
Volleyライブラリを使用している人は、このgradle行の追加がアプリではなく、ライブラリの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を追加した場合、ヒントはなく、ビルドできますが、実行できません。2つのコピー 'org.apache.http'があるためです
YETI

1
[2.1]そのため、Android Studioを閉じてから再起動し、レガシーコードを利用するファイルを開かないでください。「ヒント」は適用されません。ファイルを開く必要がある場合は、コードを所有していることを示しているため、[4]制御するコードでのHttpClientの使用を停止する必要があります。
ストラヤ2015

(build-tool&sdk)23の振る舞いが奇妙な理由を知らない。イベントは、開発者が心の中で「apche http」を使用することをサポートしていません。
YETI 2015

1
この動作を回避するには、Android Studioを最新バージョンに更新する必要があります。新しいバージョンで修正されています
rawcoder064 '26

「HTTPを処理するためにサポートされているメソッド」とは何ですか?
ウォルドガイスト

59

下のリンクにある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 '30

48

SDKレベル23にApache HTTPを使用するには:

トップレベルの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/
    }
    ...
}

Gradleの更新に関するAndroidスタジオからの通知:

Gradleの更新に関するAndroid Studioからの通知

モジュール固有の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- https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2FからApache jarファイル(この回答の時点)4.5.zipファイルをダウンロードし
ます

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ではサポートされなくなりました。Android6.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ファイルのアップロードに使用するときにも役立ちます。


それがあなたを助けると聞いてうれしいです:)
android_sh

私はそれに問題があります...エントリの重複:org / apache / http / HttpHeaders.class。何が問題なのか知っていますか?
DaniG 2016年

7

API 22では非推奨になり、API 23では完全に削除されました。新しい追加からすべての凝ったものを必要としない場合の簡単な回避策は、API 22より前に統合されたApacheの.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

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

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で直接使用することはできません。しかし、それを使用する方法があります。以下のように、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ファイルの依存関係{}セクション内にコンパイルファイル( 'libs / org.apache.http.legacy.jar')を追加します。


あなたが与えた最後のオプションはうまく機能します。ありがたいです。
ジョセフ

5

ApacheHttp Clientはv23 SDKで削除されました。HttpURLConnectionまたはOkHttpのようなサードパーティのHttpクライアントを使用できます。

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


HttpUrlConnectionHttpClientの代わりに実際に使用することをお勧めします
Ben Pearson


4

HttpClientはSDK 23および23以降ではサポートされていません。

SDK 23を使用する必要がある場合は、以下のコードをGradleに追加します。

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

それは私のために働いています。お役に立てれば幸いです。


SDKバージョン24で完全に機能
Mehta

4

SDK 23が必要な場合は、これをGradleに追加します。

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

4

1行だけ追加する必要があります

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

プロジェクト内にはどのAPIターゲットがありますか?AndroidHttpClientAPIレベル8 <専用です。そして見てくださいここに

コードをお楽しみください:)


3

前に述べたように、 org.apache.http.client.HttpClientは以下ではサポートされていません。

SDK(APIレベル)#23。

あなたが使用する必要があります java.net.HttpURLConnection

あなたが使用しているとき、あなたのコード(と人生は)楽にしたい場合はHttpURLConnection、ここでWrapperあなたが持つ単純な操作を行うようになる、このクラスのGETPOSTおよびPUT使用してJSONやって、例えばのように、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()

お気軽にご利用ください。

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

依存関係の下にこれらの2行を追加します

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

その後

useLibrary 'org.apache.http.legacy'

アンドロイドの下で


1

別の方法は、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')
}

0

エラー:(30、0)Gradle DSLメソッドが見つかりません: 'classpath()'考えられる原因:

  • プロジェクト 'cid'は、メソッドを含まないAndroid Gradleプラグインのバージョンを使用している可能性があります(たとえば、 'testCompile'は1.1.0で追加されました)。プラグインをバージョン2.3.3にアップグレードしてプロジェクトを同期
  • プロジェクト 'cid'は、メソッドを含まないGradleのバージョンを使用している可能性があります。Gradleラッパーファイルを開く
  • ビルドファイルにGradleプラグインがない可能性があります。Gradleプラグインを適用する

  • 0

    アプリケーションタグ内のManifest.xmlのAndroid API 28以降の場合

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

    -1

    Android Studioのバージョンに応じて、Android Studioを更新することも重要だと思います。みんなのアドバイスに従ってもイライラしていましたが、運が悪かったので、Androidのバージョンを1.3から1.5にアップグレードするまで、エラーは次のように消えましたマジック。

    弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.