O HttpClient não será importado no Android Studio

359

Eu tenho uma classe simples escrita no Android Studio:

package com.mysite.myapp;

import org.apache.http.client.HttpClient;

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

e a partir disso, recebo o seguinte erro de tempo de compilação:

Cannot resolve symbol HttpClient

Não está HttpClientincluído no Android Studio SDK? Mesmo que não seja, eu o adicionei à minha compilação Gradle assim:

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

Com ou sem a última linha de compilação, o erro é o mesmo. o que estou perdendo?

AndroidDev
fonte
4
Tente usar AndroidHttpClientse puder. Os stubs HttpClient estão de fato contidos no jar do Android, portanto, não há necessidade de se referir a ele explicitamente. Observe que a versão android do httpclient é provavelmente 4.1.1. Tentar usar uma versão mais recente em cima disso geralmente está causando problemas (leia-se: não funciona, porque o carregador de classe de firmware sempre vence).
dhke

Respostas:

813

HttpClientnão é mais suportado no sdk 23. É necessário usar URLConnectionou fazer o downgrade para o sdk 22 (compile 'com.android.support:appcompat-v7:22.2.0' )

Se você precisar do sdk 23, adicione isso ao seu gradle:

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

Você também pode tentar baixar e incluir HttpClient jar diretamente em seu projeto ou usar OkHttp vez

Ilya Blokh
fonte
3
Link do anúncio: developer.android.com/preview/…
dhke 22/08/2015
20
Não faz nada no meu caso. Por quê?
desenvolvedor android
2
useLibrary não pode ser resolvido quando eu o adiciono. Meu alvo é 23, o que estou perdendo?
Badr
11
android { useLibrary 'org.apache.http.legacy' } [quando você adiciona isso] [1] 'org.apache.http' android-studio ainda tem dicas: 'Não é possível resolver o símbolo' [2] isso faz com que o android-studio (com sdk23) possa ser construído. embora haja dicas (não é possível resolver o símbolo) [3] se você adicionar jar, não há dicas, pode criar, mas !!! não pode ser executado, porque possui duas cópias 'org.apache.http'
YETI
11
Para qualquer pessoa que esteja usando a Volleybiblioteca, observe que essa adição da linha gradle deve ser inserida no arquivo gradle da biblioteca, e não no seu aplicativo. Funciona perfeitamente! Muito obrigado!
precisa saber é o seguinte
162

O HttpClient foi descontinuado no nível 22 da API e removido no nível 23 da API. Você ainda pode usá-lo no nível 23 da API e em diante, se necessário; no entanto, é melhor mudar para métodos suportados para lidar com HTTP. Portanto, se você estiver compilando com 23, adicione isso em seu build.gradle:

android {
    useLibrary 'org.apache.http.legacy'
}
Straya
fonte
4
android { useLibrary 'org.apache.http.legacy' } [quando você adiciona isso] [1] 'org.apache.http' android-studio ainda tem dicas: 'Não é possível resolver o símbolo' [2] isso faz com que o android-studio (com sdk23) possa ser construído. embora haja dicas (não é possível resolver o símbolo) [3] se você adicionar jar, não há dicas, pode criar, mas !!! não pode ser executado, porque possui duas cópias 'org.apache.http'
YETI
11
[2.1] Feche o Android Studio e inicie-o novamente, não abra os arquivos que fazem uso do código legado e as "dicas" não serão aplicadas. Se você precisar abrir o arquivo, isso sugere que você possui o código, então [4] você deve parar de usar HttpClient no código que você controla.
straya 16/09/15
Não sei por que (build-tool & sdk) 23 se comporta tão maluco. O desenvolvedor de suporte a donot de evento usa 'apche http' na mente.
YETI
11
Você tem que atualizar o estúdio Android para a versão mais recente para evitar este comportamento ...... seu fixo na nova versão
rawcoder064
Quais são os "métodos suportados para lidar com HTTP"?
Waldgeist
59

A resposta do TejaDroid no link abaixo me ajudou. Não é possível importar o org.apache.http.HttpResponse no Android Studio

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'
    ...
}
Vinay
fonte
Obrigado Esta é a única solução que trabalhou com o novo eperimental constrói como useLibrary não é reconhecido nele
pt123
Esta é realmente uma resposta melhor do que a acima! ele funciona com versões mais recentes do compilador
Matan Dahan
48

Para usar o Apache HTTP para SDK Nível 23:

Nível superior 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/
    }
    ...
}

Notificação do estúdio Android sobre atualização gradle:

Notificação do estúdio Android sobre atualização gradle

Build.gradle específico do módulo - /app/build.gradle

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

Tente isso funcionou para mim Adicione essa dependência ao seu arquivo build.gradle

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
Joshi Pritish
fonte
16

1- baixe os arquivos jar do Apache (como nesta resposta) 4.5.zip file:
https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe.com%2F

2- abra o zip, copie os arquivos jar na sua pasta libs. Você pode encontrá-lo se for ao topo do seu projeto, onde está escrito "Android", você encontrará uma lista quando clicar nele. Assim,

Android -> Projeto -> aplicativo -> libs

Coloque os frascos lá.

3- No build.gradle (Module: app) adicione

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

no

 dependency { 
   }

4- Na classe java, adicione estas importações:

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;
Badr
fonte
14

O HttpClient não é mais suportado no sdk 23. A versão Android 6.0 (API Nível 23) remove o suporte ao cliente HTTP Apache. Você tem que usar

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

e adicione também o snippet de código abaixo em sua dependência:

// solução final http para serviço da web (incluindo upload de arquivo)

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

Também o ajudará enquanto você usa Usar MultipartEntity para upload de arquivos .

android_sh
fonte
Fico feliz em ouvir que ele ajuda você :)
android_sh
Estou com problemas com isso ... entrada duplicada: org / apache / http / HttpHeaders.class. Você sabe qual é o problema?
DaniG
7

na API 22, elas se tornam obsoletas e na API 23 as removeram completamente, uma solução simples, se você não precisar de todas as coisas sofisticadas das novas adições, é simplesmente usar os arquivos .jar do apache que foram integrados antes da API 22, mas como arquivos .jar separados:

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
Catalin
fonte
7

Se você deseja importar alguma classe como:

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;

Você pode adicionar a seguinte linha no build.gradle (dependências 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'

}
A.Bahrami
fonte
Resposta perfeita! Eu tive que usar o wrap.org.apache, pois precisava atualizar um projeto muito antigo. Obrigado.
precisa saber é o seguinte
6

Você pode simplesmente adicionar isso às dependências do Gradle:

compile "org.apache.httpcomponents:httpcore:4.3.2"
Mostafa Abdellateef
fonte
2
Isso ajuda. Mas ainda não é suficiente se você quiser usar outras classes como HttpGet. Para isso eu usei #compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
AlexAndro 05/10
6

A versão Android 6.0 (API Nível 23) remove o suporte ao cliente HTTP Apache. Portanto, você não pode usar esta biblioteca diretamente na API 23. Mas existe uma maneira de usá-la. Adicione useLibrary 'org.apache.http.legacy' em seu arquivo build.gradle como abaixo:

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

Se isso não funcionar, você pode aplicar o seguinte hack-

- Copie org.apache.http.legacy.jar, que está no caminho / plataformas / android-23 / opcional do diretório do Android SDK para a pasta app / libs do seu projeto.

- Agora adicione arquivos de compilação ('libs / org.apache.http.legacy.jar') dentro da seção dependências {} do arquivo build.gradle.

user3766643
fonte
A última opção que você deu faz o trabalho bem. Eu aprecio.
Joseph
5

O ApacheHttp Client é removido no v23 sdk. Você pode usar o HttpURLConnection ou o cliente Http de terceiros como o OkHttp.

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

Kirtan
fonte
Uso de HttpUrlConnectioné realmente incentivada em vez de HttpClient
Ben Pearson
4

Basta usar este: -

android {
         .
         .
         .
 useLibrary 'org.apache.http.legacy'
         .
         .
         .
          }
Kaushal Kishor
fonte
4

HttpClient não é suportado nos sdk 23 e 23+.

Se você precisar usar o sdk 23, adicione o código abaixo ao seu gradle:

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

Está funcionando para mim. Espero que seja útil para você.

Sneha Patel
fonte
Funcionou perfeitamente com o SDK versão 24
Daksh Mehta
4

Se você precisar do sdk 23, adicione isso ao seu gradle:

android {
    useLibrary 'org.apache.http.legacy'
}
Shiv Buyya
fonte
4

Você precisa adicionar apenas uma linha

useLibrary 'org.apache.http.legacy'

em build.gradle (Module: app), por exemplo

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'
}
Nilesh Panchal
fonte
3

Qual destino de API você possui no seu projeto? AndroidHttpClienté apenas para o nível 8 da API <. e por favor dê uma olhada aqui

aproveite seu código :)

John smith
fonte
3

Como mencionado anteriormente, org.apache.http.client.HttpClient não é mais suportado em:

SDK (nível da API) nº 23.

Você tem que usar java.net.HttpURLConnection .

Se você quiser fazer o seu código (e de vida) mais fácil quando se usa HttpURLConnection, aqui está uma Wrapperdesta classe que vai deixar você fazer operações simples com GET, POSTe PUTutilizando JSON, como por exemplo, fazer um 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()

Sinta-se livre para usá-lo.

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;
    }

}
Alejandro Pablo Tkachuk
fonte
2

Adicione essas duas linhas em dependências

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

então

useLibrary 'org.apache.http.legacy'

sob o andróide

Ramindu Rusara Senarath
fonte
1

Outra maneira é se você tiver o arquivo httpclient.jar , poderá fazer o seguinte:

Cole o seu arquivo .jar na "pasta libs" do seu projeto. Em gradle, adicione esta linha no seu build.gradle (Módulo: 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')
}
Pre_hacker
fonte
0

Erro: (30, 0) Método DSL Gradle não encontrado: 'classpath ()' Possíveis causas:

  • O projeto 'cid' pode estar usando uma versão do plug-in Android Gradle que não contém o método (por exemplo, 'testCompile' foi adicionado na 1.1.0). Atualize o plug-in para a versão 2.3.3 e sincronize o projeto
  • O projeto 'cid' pode estar usando uma versão do Gradle que não contém o método. Abrir arquivo wrapper Gradle
  • O arquivo de compilação pode estar sem um plug-in Gradle. Aplicar plugin Gradle
  • Eshan Chattaraj
    fonte
    0

    Para API Android 28 e superior no Manifest.xml dentro da tag do aplicativo

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

    Acho que, dependendo da versão do Android Studio que você possui, é importante que você atualize seu android studio também. Fiquei frustrado também seguindo os conselhos de todos, mas sem sorte, até que tive que atualizar minha versão do Android de 1.3 para 1.5, os erros desapareceram como Magia.

    steven89806
    fonte