HttpClient, Android Studio'ya aktarılmaz


359

Android Studio'da yazılmış basit bir sınıfım var:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

ve bundan aşağıdaki derleme zamanı hatasını alıyorum:

Cannot resolve symbol HttpClient

HttpClientAndroid Studio SDK'sına dahil değil mi? Olmasa bile, Gradle derlememe şöyle ekledim:

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

Son derleme satırı olsun veya olmasın, hata aynıdır. Neyi kaçırıyorum?


4
AndroidHttpClientMümkünse kullanmaya çalışın . HttpClient taslakları gerçekten de android kavanoz içinde bulunur, bu yüzden açıkça başvurmaya gerek yoktur. Httpclient'in android sürümünün muhtemelen 4.1.1 olduğunu unutmayın. Bunun üzerine daha yeni bir sürüm kullanmaya çalışmak genellikle sorun ister (okuma: çalışmaz, çünkü üretici yazılımı yükleyici her zaman kazanır).
Dhke

Yanıtlar:


813

HttpClientsdk 23'te artık desteklenmiyor URLConnection. sdk 22 ( compile 'com.android.support:appcompat-v7:22.2.0') kullanmanız veya bu sürüme geçmeniz gerekiyor

SDK 23'e ihtiyacınız varsa, bunu sınıfınıza ekleyin:

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

Ayrıca, HttpClient kavanozunu doğrudan projenize indirmeyi veya dahil etmeyi deneyebilir veya bunun yerine OkHttp'yi kullanabilirsiniz.


3
Duyuru bağlantısı: developer.android.com/preview/…
dhke

20
Benim durumumda hiçbir şey yapmıyor. Nasıl olur?
android geliştirici

2
useLibrary, eklediğimde çözülemiyor. Hedefim 23, neyi özlüyorum?
Badr

1
android { useLibrary 'org.apache.http.legacy' } [u eklediğinizde] [1] 'org.apache.http' android- studio'un hala ipuçları var: 'Sembol çözülemiyor' [2] bu android-studio (sdk23 ile) yapabilir. olsa da ipuçları var (sembol çözülemez) [3] u kavanoz eklerseniz, hiçbir ipucu, inşa edemez, ama !!! çalışamaz, çünkü iki kopyası vardır 'org.apache.http'
YETI

1
VolleyKütüphaneyi kullanan herkes için bu not satırı eklentisinin uygulamanıza değil, kitaplık not dosyasına girmesi gerektiğini unutmayın. Mükemmel çalışıyor! Bir ton teşekkürler!
sravan953

162

HttpClient API Seviyesi 22'de kullanımdan kaldırıldı ve API Seviyesi 23'te kaldırıldı. Gerekirse yine de API Seviyesi 23'te ve sonrasında kullanabilirsiniz, ancak HTTP'yi işlemek için desteklenen yöntemlere geçmek en iyisidir. Yani, 23 ile derliyorsanız, bunu build.gradle'ınıza ekleyin:

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

4
android { useLibrary 'org.apache.http.legacy' } [u eklediğinizde] [1] 'org.apache.http' android- studio'un hala ipuçları var: 'Sembol çözülemiyor' [2] bu android-studio (sdk23 ile) yapabilir. olsa da ipuçları var (sembol çözülemez) [3] u kavanoz eklerseniz, hiçbir ipucu, inşa edemez, ama !!! çalışamaz, çünkü iki kopyası vardır 'org.apache.http'
YETI

1
[2.1] Android Studio'yu kapatın ve yeniden başlatın, eski kodu kullanan dosyaları açmayın, "ipuçları" uygulanmaz. Dosyayı açmanız gerekiyorsa, kodun size ait olduğunu önerir, bu nedenle [4] kontrol ettiğiniz kodda HttpClient kullanmayı bırakmalısınız.
straya

Donot bilmek neden (build-tool & sdk) 23's açık çok ucube. Olay bağışçı destek geliştirici kişinin aklında 'apche http' kullanın.
YETI

1
Bu davranışı önlemek için android stüdyosunu en son sürüme güncellemelisiniz ...... yeni sürümde düzeltildi
rawcoder064

"HTTP işlemek için desteklenen yöntemler" nelerdir?
waldgeist

59

TejaDroid'in aşağıdaki bağlantıdaki cevabı bana yardımcı oldu. Android Studio'da org.apache.http.HttpResponse içe aktarılamıyor

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 içinde tanınmadığı için yeni deneysel yapılarla çalışan tek çözüm budur
pt123 01:

Bu aslında yukarıdaki yanıttan daha iyi bir cevap! derleyicinin yeni sürümleriyle çalışır
Matan Dahan

48

SDK Seviye 23 için Apache HTTP'yi kullanmak için:

Üst düzey 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 stüdyosundan not güncellemesi ile ilgili bildirim:

Android stüdyosundan not güncellemesi ile ilgili bildirim

Modüle özgü build.gradle - /app/build.gradle

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

31

Bu benim için çalıştı Bu bağımlılığı build.gradle dosyasına ekleyin

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

16

1- Apache jar dosyalarını indirin (bu yanıttan itibaren) 4.5.zip dosyasını şuradan indirin:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- jar dosyalarını zip kopyalarını libs klasörünüze açın. Projenizin üstünde "Android" yazan yere giderseniz, onu tıkladığınızda bir liste bulacaksınız. Yani,

Android -> Proje -> uygulama -> kütüphaneler

O zaman kavanozları oraya koy.

3- In build.gradle (Modül: app) ekleyin

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

içinde

 dependency { 
   }

4- Java sınıfına şu ithalatı ekleyin:

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'te artık desteklenmiyor. Android 6.0 (API Seviye 23) sürümü Apache HTTP istemcisi desteğini kaldırır. Kullanmak zorundasın

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

ve bağımlılığınıza aşağıdaki kod snippet'ini de ekleyin:

// web hizmeti için http nihai çözümü (dosya yükleme dahil)

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

Ayrıca, Dosya yüklemesi için MultipartEntity Kullan'ı kullanırken size yardımcı olacaktır .


Size yardımcı olduğunu duyduğuma sevindim :)
android_sh

Bu ... yinelenen giriş ile ilgili sorunlar var: org / apache / http / HttpHeaders.class. Sorunun ne olduğunu biliyor musun?
DaniG

7

API 22'de kullanımdan kaldırılırlar ve API 23'te tamamen kaldırırlar, yeni eklemelerden tüm süslü şeylere ihtiyacınız yoksa basit bir çözüm, API 22'den önce entegre olan apache'den .jar dosyalarını kullanmaktır, ancak ayrılmış .jar dosyaları olarak:

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

Aşağıdaki gibi bir sınıfı içe aktarmak istiyorsanız:

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 dosyasına (Gradle bağımlılıkları) aşağıdaki satırı ekleyebilirsiniz.

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'

}

Mükemmel cevap! Çok eski bir projeyi güncellemem gerektiğinden wrapped.org.apache'yi kullanmak zorunda kaldım. Teşekkürler.
dianakarenms

6

Bunu Gradle bağımlılıklarına ekleyebilirsiniz:

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

2
Bu yardımcı olur. Ama yine de diğer sınıfları kullanmak istiyorsanız yeterli değil HttpGet. Bunun için kullandımcompile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro

6

Android 6.0 (API Seviye 23) sürümü Apache HTTP istemcisi desteğini kaldırır. Bu nedenle bu kütüphaneyi doğrudan API 23'te kullanamazsınız. Ancak kullanmanın bir yolu var. Build.gradle dosyanıza useLibrary 'org.apache.http.legacy' öğesini aşağıdaki gibi ekleyin-

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

Bu işe yaramazsa aşağıdaki hack-

- Android SDK dizininizin / platformlar / android-23 / isteğe bağlı yolunda bulunan org.apache.http.legacy.jar dosyasını projenizin uygulama / libs klasörüne kopyalayın.

- Şimdi build.gradle dosyasının bağımlılıkları {} bölümüne derleme dosyaları ('libs / org.apache.http.legacy.jar') ekleyin.


Verdiğiniz son seçenek işi iyi yapıyor. Takdir ediyorum.
Joseph

5

ApacheHttp Client v23 sdk içinde kaldırıldı. HttpURLConnection veya OkHttp gibi üçüncü taraf Http Client'ı kullanabilirsiniz.

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


HttpUrlConnectionHttpClient yerine kullanımı teşvik edilir
Ben Pearson

4

Sadece şunu kullanın: -

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

4

HttpClient sdk 23 ve 23+ sürümlerinde desteklenmez.

SDK 23 olarak kullanmanız gerekiyorsa, sınıfınıza aşağıdaki kodu ekleyin:

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

Benim için çalışıyor. Sizin için yararlı umut.


SDK sürüm 24
Daksh Mehta

4

SDK 23'e ihtiyacınız varsa, bunu sınıfınıza ekleyin:

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

4

Sadece bir satır eklemelisin

useLibrary 'org.apache.http.legacy'

build.gradle (Modül: app) içine, örneğin

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

Projenizde hangi API hedefiniz var? AndroidHttpClientyalnızca API Seviye 8 <için geçerlidir. ve lütfen buraya bir göz atın

kodunuzun tadını çıkarın :)


3

Daha önce de belirtildiği gibi org.apache.http.client.HttpClient, artık desteklenmiyor:

SDK (API düzeyi) # 23.

Kullanmak zorundasın java.net.HttpURLConnection.

Eğer kullanırken kodu (ve hayat) kolaylaştırmak istiyorsanız HttpURLConnection, burada olduğunu Wrappersize basit işlemleri yapalım bu sınıfın GET, POSTve PUTkullanan JSONbir yapıyor, örneğin gibi 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()

Kullanmaktan çekinmeyin.

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

Bu iki satırı bağımlılıklar altında ekleyin

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

sonra

useLibrary 'org.apache.http.legacy'

android altında


1

Başka bir yol httpclient.jar dosyanız varsa, bunu yapabilirsiniz:

.Jar dosyanızı projenizdeki "libs klasörüne" yapıştırın. Ardından, bu satırı build.gradle (Modül: app) öğesine ekleyin.

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

Hata: (30, 0) Gradle DSL yöntemi bulunamadı: 'classpath ()' Olası nedenler:

  • 'Cid' projesi, Android Gradle eklentisinin yöntemi içermeyen bir sürümünü kullanıyor olabilir (örn. 'TestCompile' 1.1.0'da eklenmiştir). Eklentiyi 2.3.3 sürümüne yükseltin ve projeyi senkronize edin
  • 'Cid' projesi Gradle'ın yöntemi içermeyen bir sürümünü kullanıyor olabilir. Gradle sarıcı dosyasını aç
  • Derleme dosyasında Gradle eklentisi eksik olabilir. Gradle eklentisini uygula

  • 0

    Uygulama etiketi içinde Manifest.xml'de android API 28 ve üstü için

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

    -1

    Hangi Android Studio sürümüne sahip olduğunuza bağlı olarak, android stüdyomuzu da güncellemeniz önemlidir, android sürümümü 1.3'den 1.5'e yükseltmek zorunda kalıncaya kadar herkesin tavsiyesine göre çok hayal kırıklığına uğradım, hatalar ortadan kayboldu büyü.

    Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.