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

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

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

Документация 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

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

Используя этот класс, вы можете легко:

  1. Отправить GET Http GET
  2. Отправить запрос Http POST
  3. Отправить запрос Http PUT
  4. Отправить Http DELETE
  5. Отправить запрос без дополнительных параметров и проверить HTTP status code
  6. Добавьте пользовательские HTTP Headers для запроса (используя varargs)
  7. Добавить параметры данных как запрос String для запроса
  8. Добавить параметры данных как HashMap {key = значение}
  9. Принять ответ как String
  10. Принять ответ как JSONObject
  11. Accept response as 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's 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's 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/bc" in background using AsyncTask new AsyncTask<Void, Void, String>(){ protected String doInBackground(Void[] params) { String response=""; try { response=new HttpRequest("http://url.com/bc").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(); 

Следующий код находится в 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

Это решение, которое я применил к проблеме, которую 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; } } 

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

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

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

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

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

Если они предназначены для 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 {} в качестве обходного пути. Это, по-видимому, необходимо для некоторых собственных gsm-библиотек Google!

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

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