web-dev-qa-db-ja.com

Android非推奨のApacheモジュール(HttpClient、HttpResponseなど)

AndroidはAPIレベル22以降、Apacheモジュールを非推奨にしているので、私の質問は、たとえばAndroid SDKではなく、ApacheライブラリのHttpResponseをどのように使用すればよいですか?問題は、両方のパッケージで同じだということです。

ただし、たとえば、HttpGetは問題ありません。ApacheではHttpGetHC4と呼ばれるためです。

58
Evgeniy

メソッドHttpClientは廃止されました。この例でわかるように、URLConnectionを使用できるようになりました。

private StringBuffer request(String urlString) {
    // TODO Auto-generated method stub

    StringBuffer chaine = new StringBuffer("");
    try{
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestProperty("User-Agent", "");
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.connect();

        InputStream inputStream = connection.getInputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = rd.readLine()) != null) {
            chaine.append(line);
        }
    }
    catch (IOException e) {
        // Writing exception to log
        e.printStackTrace();
    }
    return chaine;
}

これが誰かを助けることを願っています。

40
vincent091

Apacheのモジュールを使用しても何も悪いことはありません。 Googleはフォークを成功させることができなかったため、大きな混乱をもたらしました。 GoogleとApacheの統合はJesse Wilsonが監督しました。彼はGoogleで働き、すべてを台無しにしてから、スクエアでの作業中に独自のライブラリ(OkHttp)を作成しました。それは本当にい話です。

古いバージョンのApacheライブラリが含まれており、改善やバグ修正が行われていないため、レガシーのJARファイルを使用しないことをお勧めします(これは 非常に古いpre-BETAスナップショット です)。 Apacheコンポーネントの 公式ページ でわかるように、Androidバージョンのすべてと互換性のある新しい4.4バージョンがあります。古いバージョンとの衝突を避けるために、異なる名前空間で再パッケージ化する必要がありました。

Maven (または GitHubからリリースをダウンロード )から依存関係を追加するだけです:

dependencies {
    compile "cz.msebera.Android:httpclient:4.4.1.2"
}

そして、org.Apache.httpcz.msebera.Android.httpclientに置き換えると、インポートは次のようになります。

import cz.msebera.Android.httpclient.Header;
import cz.msebera.Android.httpclient.HttpHost;
import cz.msebera.Android.httpclient.HttpResponse;

ええ、作業コードの書き換えに何時間も無駄にすることなく、Apacheライブラリの使用を続けることができます!

ApacheコンポーネントとHttpURLConnectionの使用の違いについては、HttpURLConnectionは応答キャッシュを使用します...それだけです。私はあなたが本当にそれを望んでいるかどうかもわかりませんし、あなた自身でいつでもそれを実装することができます。

ところで、私はHttpURLConnectionのような代替手段を試しました-それらはApacheのパワーとシンプルさにも近くありません。

27
Jehy

Android Marshmallow(sdk 23)では、次を追加できます。

useLibrary 'org.Apache.http.legacy'

回避策としてAndroid {}セクションのbuild.gradleに。これは、Google独自のgmsライブラリの一部に必要なようです!

22
fattire

もし私があなただったら、私はHttpClientを使用しません:

Apache HTTPクライアントでは、EclairとFroyoのバグが少なくなっています。これらのリリースに最適です。

Gingerbread以上の場合、HttpURLConnectionが最適です。

参照

OKHttp または HttpUrlConnection を使用します。また、ApacheライブラリはAndroidにとって効率的ではない可能性があるため、使用しないことをお勧めします。

11
mmlooloo

Androidに同梱されているものではなく、プロジェクトでApacheライブラリを直接使用できると思います(この方法でさらに制御できます。必要に応じて古いSDKバージョンでコンパイルできます)。

build.gradleで、次の行を追加します。

dependencies {
    compile group: 'org.Apache.httpcomponents' , name: 'httpclient-Android' , version: '4.3.5.1'
}

警告を防ぐには、これらの行も追加します:

Android {

     -- YOUR EXISTING LINES --

     packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }

}
6
Vivi

これをアプリの依存関係に追加すると、正しく機能します。

dependencies {
...
  compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.Apache.http.client:4.1.2'
}

それでもhttpclientライブラリを使用する場合は、build.gradleファイルに説明を追加する必要があります。そして、build.gradleファイルに追加されるコンテンツは、ターゲットAndroidプロジェクトビルドによって決定されるようです。

aPI22以前を対象とする場合は、build.gradleに次の行を追加する必要があります

dependencies {
    compile group: 'org.Apache.httpcomponents' , name: 'httpclient-Android' , version: '4.3.5.1'
}

aPI23以降を対象とする場合、次の行をbuild.gradleに追加する必要があります

dependencies {
    compile group: 'cz.msebera.Android' , name: 'httpclient', version: '4.4.1.1'
}

ここにリファレンスがあります link

1
A-Shi