Ошибка в HttpConnection - Android [дубликат]

Ну, одно практическое использование, которое я обнаружил, - это уменьшение кодовой таблички. Например:

void process_z_vec(vector<int>& vec)
{
  auto print_2d = [](const vector<int>& board, int bsize)
  {
    for(int i = 0; i<bsize; i++)
    {
      for(int j=0; j<bsize; j++)
      {
        cout << board[bsize*i+j] << " ";
      }
      cout << "\n";
    }
  };
  // Do sth with the vec.
  print_2d(vec,x_size);
  // Do sth else with the vec.
  print_2d(vec,y_size);
  //... 
}

Без lambda вам может понадобиться сделать что-то для разных случаев bsize. Конечно, вы могли бы создать функцию, но что, если вы хотите ограничить использование в рамках функции пользователя души? характер lambda выполняет это требование, и я использую его для этого случая.

312
задан Eric Leschinski 8 January 2016 в 15:45
поделиться

22 ответа

HttpClient больше не поддерживается в sdk 23. Вы должны использовать URLConnection или перейти на sdk 22 (compile 'com.android.support:appcompat-v7:22.2.0')

Если вам нужен sdk 23, добавьте это в свою граду :

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

Вы также можете попытаться загрузить и включить HttpClient jar прямо в свой проект или использовать OkHttp вместо

720
ответ дан Ilya Blokh 16 August 2018 в 02:17
поделиться
  • 1
    Ссылка на объявление: developer.android.com/preview/… – dhke 22 August 2015 в 07:15
  • 2
    В моем случае это ничего не делает. Как так? – android developer 3 September 2015 в 12:04
  • 3
    useLibrary нельзя решить, когда я его добавлю. Моя цель 23, чего я не хватает? – fullMoon 8 September 2015 в 11:05
  • 4
    @androiddeveloper, я был тем же. См. Мой ответ ниже. – fullMoon 8 September 2015 в 19:41
  • 5
    android { useLibrary 'org.apache.http.legacy' } [когда u добавить это] [1] 'org.apache.http' Android-студия все еще имеет советы: «Невозможно разрешить символ» [2 ] это может сделать андроид-студия (с sdk23). хотя есть подсказки (не удается разрешить символ) [3] , если вы добавляете jar, нет никаких советов, можете создавать, но !!! не может работать, потому что у него есть две копии 'org.apache.http' – YETI 16 September 2015 в 07:46

Как уже упоминалось ранее, org.apache.http.client.HttpClient больше не поддерживается:

SDK (уровень API) # 23.

Вы должны использовать java.net.HttpURLConnection.

Если вы хотите сделать свой код (и жизнь) проще при использовании HttpURLConnection, вот Wrapper этого класса, позволит вам выполнять простые операции с GET, POST и 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
ответ дан Alejandro Pablo Tkachuk 16 August 2018 в 02:17
поделиться

Использовать Apache HTTP для SDK уровня 23:

Top level 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 о обновлении градиента:

Тип модуля build.gradle - /app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}
47
ответ дан AndreyICE 16 August 2018 в 02:17
поделиться

HttpClient больше не поддерживается в sdk 23. Релиз Android 6.0 (API Level 23) удаляет поддержку для HTTP-клиента Apache. Вы должны использовать

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

, а также добавить ниже фрагмент кода в вашей зависимости:

// http окончательное решение для веб-сервиса (включая загрузку файлов)

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

Он также поможет вам, пока вы используете Use MultipartEntity для загрузки файлов.

14
ответ дан android_sh 16 August 2018 в 02:17
поделиться
  • 1
    Это помогло мне – Seph Remotigue 11 May 2016 в 10:05
  • 2
    Рад слышать, что это помогает вам :) – android_sh 18 May 2016 в 10:39
  • 3
    У меня проблемы с этим ... duplicate entry: org / apache / http / HttpHeaders.class. Вы знаете, в чем проблема? – DaniG 21 November 2016 в 21:23

в API 22 они устаревают, и в API 23 они полностью их удалили, простое обходное решение, если вам не нужны все причудливые вещи из новых дополнений, - просто использовать файлы .jar из apache, которые были интегрированы перед 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
6
ответ дан Catalin 16 August 2018 в 02:17
поделиться

Ответ TejaDroid в ссылке ниже помог мне. Невозможно импортировать org.apache.http.HttpResponse в 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'
    ...
}
51
ответ дан Community 16 August 2018 в 02:17
поделиться
  • 1
    тоже работал на меня – John Joe 31 December 2015 в 10:07
  • 2
    спасибо, это единственное решение, которое работало с новыми экспериментальными сборками, поскольку пользовательская библиотека не распознается в нем – pt123 16 January 2016 в 02:48
  • 3
    thankz.It работает для меня – Sandun Harshana 20 January 2016 в 06:48
  • 4
    Эта работа для меня с 23 сборкой. – Moxet Khan 5 March 2016 в 20:43
  • 5
    На самом деле это лучший ответ, чем выше! он работает с более новыми версиями компилятора – Matan Dahan 30 May 2016 в 12:01

1- загрузка файлов jar Apache (с этого ответа). 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

, затем поместите там банки.

3- В сборке .gradle (Module: app) add

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;
15
ответ дан darrenp 16 August 2018 в 02:17
поделиться

Ошибка: (30, 0) Метод Gradle DSL не найден: 'classpath ()' Возможные причины:

  • В проекте «cid» может использоваться версия подключаемого модуля Android Gradle, который не содержит метода (например, 'testCompile' был добавлен в 1.1.0). Обновление плагина до версии 2.3.3 и проекта синхронизации
  • В проекте «cid» может использоваться версия Gradle, которая не содержит этот метод. Open gradle wrapper file
  • В файле сборки может отсутствовать плагин Gradle. Применить плагин Gradle
  • 0
    ответ дан Eshan Chattaraj 16 August 2018 в 02:17
    поделиться

    Клиент ApacheHttp удален в v23 sdk. Вы можете использовать HttpURLConnection или сторонний Http-клиент, например OkHttp.

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

    5
    ответ дан Hiren S. 16 August 2018 в 02:17
    поделиться
    • 1
      Использование HttpUrlConnection на самом деле рекомендуется вместо HttpClient – Ben Pearson 1 October 2015 в 10:15

    Какой целевой API вы используете в своем проекте? AndroidHttpClient предназначен только для уровня API 8. и посмотрите здесь

    , наслаждайтесь своим кодом:)

    3
    ответ дан John smith 16 August 2018 в 02:17
    поделиться

    Просто используйте это: -

    android {
             .
             .
             .
     useLibrary 'org.apache.http.legacy'
             .
             .
             .
              }
    
    4
    ответ дан Kaushal Kishor 16 August 2018 в 02:17
    поделиться

    Вы можете просто добавить это в зависимости от Gradle:

    compile "org.apache.httpcomponents:httpcore:4.3.2"
    
    6
    ответ дан Mostafa Abdellateef 16 August 2018 в 02:17
    поделиться
    • 1
      Это помогает. Но все же недостаточно, если вы хотите использовать другие классы, такие как HttpGet. Для этого я использовал compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' – AlexAndro 5 October 2015 в 09:10

    Вы должны добавить только одну строку

    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'
    }
    
    4
    ответ дан Nilesh Panchal 16 August 2018 в 02:17
    поделиться

    Другой способ - если у вас есть файл httpclient.jar, вы можете сделать это:

    Вставьте свой .jar-файл в папку «libs» в вашем проекте. Затем в градиенте добавьте эту строку в свой 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')
    }
    
    2
    ответ дан Pre_hacker 16 August 2018 в 02:17
    поделиться

    Попробуйте это сработало для меня. Добавьте эту зависимость в ваш файл build.gradle

    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
    
    29
    ответ дан Pritish Joshi 16 August 2018 в 02:17
    поделиться

    Добавьте эти две строки в зависимости от зависимостей

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

    , затем

    useLibrary 'org.apache.http.legacy'
    

    под андроидом

    3
    ответ дан Ramindu Rusara Senarath 16 August 2018 в 02:17
    поделиться

    Если вам нужен sdk 23, добавьте это в свою граду:

    android {
        useLibrary 'org.apache.http.legacy'
    }
    
    5
    ответ дан ShivBuyya 16 August 2018 в 02:17
    поделиться

    HttpClient не поддерживается в sdk 23 и 23 +.

    Если вам нужно использовать в sdk 23, добавьте ниже код к вашему gradle:

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

    Его работа для меня. Надеюсь, вам полезно.

    5
    ответ дан Sneha Patel 16 August 2018 в 02:17
    поделиться

    Я думаю, в зависимости от того, какая версия Android Studio у вас есть, важно также обновить свою студию Android, я тоже разочаровался в советах каждого, но не повезло, пока мне не пришлось обновлять версию Android от 1.3 до 1.5, ошибки исчезли, как магия.

    -1
    ответ дан steven89806 16 August 2018 в 02:17
    поделиться

    HttpClient устарел на уровне API 22 и удален в API-уровне 23. Вы все равно можете использовать его в API-интерфейсе 23 и далее, если вам нужно, однако лучше всего перейти к поддерживаемым методам обработки HTTP. Итак, если вы компилируете с 23, добавьте это в свой build.gradle:

    android {
        useLibrary 'org.apache.http.legacy'
    }
    
    146
    ответ дан straya 16 August 2018 в 02:17
    поделиться
    • 1
      Это должен быть принятый ответ. – Kevin Krumwiede 23 August 2015 в 06:06
    • 2
      простое и быстрое решение, если кто-то не против использования устаревшего класса ... – prom85 1 September 2015 в 18:25
    • 3
      android { useLibrary 'org.apache.http.legacy' } [когда u добавить это] [1] 'org.apache.http' Android-студия все еще имеет советы: «Невозможно разрешить символ» [2 ] это может сделать андроид-студия (с sdk23). хотя есть подсказки (не удается разрешить символ) [3] , если вы добавляете jar, нет никаких советов, можете создавать, но !!! не может работать, потому что у него есть две копии 'org.apache.http' – YETI 16 September 2015 в 07:44
    • 4
      [2.1] Итак, закройте Android Studio и запустите ее еще раз, не открывайте файлы (файлы), которые используют устаревший код и «советы». не будет применяться. Если вам нужно открыть файл, то он предлагает вам собственный код, поэтому [4] вы должны прекратить использовать HttpClient в коде, которым вы управляете. – straya 16 September 2015 в 23:27
    • 5
      Вы должны обновить студию Android до последней версии, чтобы избежать этого поведения ... ее исправлено в новой версии – rawcoder064 26 October 2015 в 10:58

    релиз Android 6.0 (API Level 23) удаляет поддержку для HTTP-клиента Apache. Следовательно, вы не можете использовать эту библиотеку непосредственно в API 23. Но есть способ ее использования. Добавьте useLibrary 'org.apache.http.legacy' в ваш файл build.gradle, как показано ниже -

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

    Если это не сработает, вы можете применить следующий хак -

    - Скопируйте файл org.apache.http.legacy.jar, который находится в каталоге / platform / android-23 / optional вашего каталога Android SDK в папку вашего приложения / libs вашего проекта.

    - Теперь добавьте файлы компиляции ('libs /org.apache.http.legacy.jar ') внутри зависимых {} разделов файла build.gradle.

    6
    ответ дан user3766643 16 August 2018 в 02:17
    поделиться
    • 1
      Последний вариант, который вы дали, хорошо выполняет эту работу. Я ценю. – Jomutech Byte 22 August 2017 в 11:35
    1
    ответ дан A.Bahrami 29 October 2018 в 08:13
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: