Мне нужен альтернативный вариант для HttpClient в Android для отправки данных на PHP, поскольку он больше не поддерживается

В настоящее время я использую HttpClient, HttpPost для отправки данных на PHP server из Android app из Android app, но все эти методы были устаревшими в API 22 и удалены в API 23, поэтому каковы альтернативные варианты это?

Я искал везде, но ничего не нашел.

Ответ 1

Документация HttpClient указывает вам в правильном направлении:

org.apache.http.client.HttpClient:

Этот интерфейс устарел на уровне API 22. Вместо этого используйте openConnection(). Посетите эту веб-страницу для более подробной информации.

означает, что вы должны переключиться на java.net.URL.openConnection().

Вот как вы могли это сделать:

URL url = new URL("http://some-server");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");

// read the response
System.out.println("Response Code: " + conn.getResponseCode());
InputStream in = new BufferedInputStream(conn.getInputStream());
String response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");
System.out.println(response);

IOUtils документация: Apache Commons IO
IOUtils Зависимость от Maven: http://search.maven.org/#artifactdetails|org.apache.commons|commons-io|1.3.2|jar

Ответ 2

Я также столкнулся с этой проблемой, чтобы решить, что я создал свой собственный класс. Который основан на java.net и поддерживает до android API 24 Пожалуйста, проверьте это: HttpRequest.java

С помощью этого класса вы можете легко:

  • Отправить запрос Http GET
  • Отправить запрос Http POST
  • Отправить запрос Http PUT
  • Отправить Http DELETE
  • Отправить запрос без дополнительных параметров и проверить ответ HTTP status code
  • Добавить пользовательский HTTP Headers запрос (с использованием varargs)
  • Добавить параметры данных как String запрос для запроса
  • Добавить параметры данных как HashMap {key = значение}
  • Принять ответ как String
  • Принять ответ как JSONObject
  • Принять ответ как byte [] Массив байтов (полезно для файлов)

и любая комбинация из них - только с одной строкой кода)

Вот несколько примеров:

//Consider next request: 
HttpRequest req=new HttpRequest("http://host:port/path");

Пример 1:

//prepare Http Post request and send to "http://host:port/path" with data params name=Bubu and age=29, return true - if worked
req.prepare(HttpRequest.Method.POST).withData("name=Bubu&age=29").send();

Пример 2:

// prepare http get request,  send to "http://host:port/path" and read server response as String 
req.prepare().sendAndReadString();

Пример 3:

// prepare Http Post request and send to "http://host:port/path" with data params name=Bubu and age=29 and read server response as JSONObject 
HashMap<String, String>params=new HashMap<>();
params.put("name", "Groot"); 
params.put("age", "29");
req.prepare(HttpRequest.Method.POST).withData(params).sendAndReadJSON();

Пример 4:

//send Http Post request to "http://url.com/b.c" in background  using AsyncTask
new AsyncTask<Void, Void, String>(){
        protected String doInBackground(Void[] params) {
            String response="";
            try {
                response=new HttpRequest("http://url.com/b.c").prepare(HttpRequest.Method.POST).sendAndReadString();
            } catch (Exception e) {
                response=e.getMessage();
            }
            return response;
        }
        protected void onPostExecute(String result) {
            //do something with response
        }
    }.execute(); 

Пример 5:

//Send Http PUT request to: "http://some.url" with request header:
String json="{\"name\":\"Deadpool\",\"age\":40}";//JSON that we need to send
String url="http://some.url";//URL address where we need to send it 
HttpRequest req=new HttpRequest(url);//HttpRequest to url: "http://some.url"
req.withHeaders("Content-Type: application/json");//add request header: "Content-Type: application/json"
req.prepare(HttpRequest.Method.PUT);//Set HttpRequest method as PUT
req.withData(json);//Add json data to request body
JSONObject res=req.sendAndReadJSON();//Accept response as JSONObject

Пример 6:

//Equivalent to previous example, but in a shorter way (using methods chaining):
String json="{\"name\":\"Deadpool\",\"age\":40}";//JSON that we need to send
String url="http://some.url";//URL address where we need to send it 
//Shortcut for example 5 complex request sending & reading response in one (chained) line
JSONObject res=new HttpRequest(url).withHeaders("Content-Type: application/json").prepare(HttpRequest.Method.PUT).withData(json).sendAndReadJSON();

Пример 7:

//Downloading file
byte [] file = new HttpRequest("http://some.file.url").prepare().sendAndReadBytes();
FileOutputStream fos = new FileOutputStream("smile.png");
fos.write(file);
fos.close();

Ответ 3

Следующий код находится в AsyncTask:

В моем фоновом процессе:

String POST_PARAMS = "param1=" + params[0] + "&param2=" + params[1];
URL obj = null;
HttpURLConnection con = null;
try {
    obj = new URL(Config.YOUR_SERVER_URL);
    con = (HttpURLConnection) obj.openConnection();
    con.setRequestMethod("POST");

    // For POST only - BEGIN
    con.setDoOutput(true);
    OutputStream os = con.getOutputStream();
    os.write(POST_PARAMS.getBytes()); 
    os.flush();
    os.close();
    // For POST only - END

    int responseCode = con.getResponseCode();
    Log.i(TAG, "POST Response Code :: " + responseCode);

    if (responseCode == HttpURLConnection.HTTP_OK) { //success
         BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
         String inputLine;
         StringBuffer response = new StringBuffer();

         while ((inputLine = in.readLine()) != null) {
              response.append(inputLine);
         }
         in.close();

         // print result
            Log.i(TAG, response.toString());
            } else {
            Log.i(TAG, "POST request did not work.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

Ссылка: http://www.journaldev.com/7148/java-httpurlconnection-example-to-send-http-getpost-requests

Ответ 4

Это решение, которое я применил к проблеме, которую устарел httpclient в этой версии android 22`

 public static final String USER_AGENT = "Mozilla/5.0";



public static String sendPost(String _url,Map<String,String> parameter)  {
    StringBuilder params=new StringBuilder("");
    String result="";
    try {
    for(String s:parameter.keySet()){
        params.append("&"+s+"=");

            params.append(URLEncoder.encode(parameter.get(s),"UTF-8"));
    }


    String url =_url;
    URL obj = new URL(_url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", USER_AGENT);
    con.setRequestProperty("Accept-Language", "UTF-8");

    con.setDoOutput(true);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
    outputStreamWriter.write(params.toString());
    outputStreamWriter.flush();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + params);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine + "\n");
    }
    in.close();

        result = response.toString();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }catch (Exception e) {
        e.printStackTrace();
    }finally {
    return  result;
    }

}

Ответ 5

Какой клиент лучше всего?

У Apache HTTP-клиента меньше ошибок на Eclair и Froyo. Это лучшее выбор для этих выпусков.

Для Gingerbread и лучше, HttpURLConnection - лучший выбор. это простой API и небольшие размеры делают его очень подходящим для Android...

Ссылка здесь для получения дополнительной информации (блог разработчиков Android)

Ответ 6

Вы можете продолжать использовать HttpClient. Google отвергла только собственную версию компонентов Apache. Вы можете установить новую, мощную и не устаревшую версию Apache HttpClient, как я описал в этом сообщении: fooobar.com/questions/22801/...

Ответ 7

если он предназначен для API 22 и старше, тогда следует добавить следующую строку в build.gradle

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

если он предназначен для API 23 и более поздних версий, затем следует добавить следующую строку в build.gradle

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

Если вы хотите использовать библиотеку httpclient, в Android Marshmallow (sdk 23), вы можете добавить:

useLibrary 'org.apache.http.legacy'

для сборки .gradle в разделе android {} в качестве обходного пути. Это кажется необходимым для некоторых из собственных GMS-библиотек Google!

Ответ 8

Вы можете использовать мой простой в использовании пользовательский класс. Просто создайте объект абстрактного класса (анонимный) и определите метод onsuccess() и onfail(). https://github.com/creativo123/POSTConnection

Ответ 9

У меня были проблемы с использованием метода HttpClent и HttpPost, так как я не хотел менять свой код, поэтому я нашел альтернативную опцию в файле build.gradle(module) удаление "rc3" из buildToolsVersion "23.0.1 rc3", и это сработало для меня. Надеюсь, что это поможет.