Intereting Posts
Android Studio: Не удалось создать код ошибки JVM: -1 Listview OnItemClick listner не работает во фрагменте Как развернуть приложение phonegap прямо на устройство Как определить, открыт ли навигационный ящик? Проверьте, есть ли у устройства Android кнопка поиска оборудования Как обновить Xamarin для Android в среде Visual Studio 2015 Удалить элемент в RecyclerView- Android Как создать покупку в приложении для обновления с бесплатной версии до платной версии Android Диалоговое окно отображения входящего вызова активности Изменить обзор поверхности Предотвратить зависимость Gradle для поддержки библиотеки от переопределения более новой версией Android imageView: настройка параметров масштабирования и масштабирования Что вы не можете сделать с мобильным приложением HTML5 / Javascript, которое вы можете сделать с помощью собственного мобильного приложения? Две плавающие кнопки в одном макете Эффект андроидного увеличительного стекла

Лучшая практика получения json из url в api 23

Я использую compileSdk 23 с поддержкой библиотеки 23 версии.

Я использовал библиотеку httplegacy (я скопировал ее в папку app / libs из androidSdk / android-23 / optional / org.apache.http.legacy.jar ) и в градиенте, который я поставил:

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

Чтобы загрузить эту библиотеку.

В мой класс Connection у меня есть способ загрузить экземпляр DefaultHttpClient таким образом:

 private static HttpClient getClient(){ HttpParams httpParameters = new BasicHttpParams(); int timeoutConnection = 3000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); int timeoutSocket = 3000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); return httpClient; } 

Но Android Studio говорит, что все классы apache.http устарели.

Что я могу использовать, чтобы следовать лучшей практике?

Есть причина, почему это было устарело. Согласно этой официальной странице :

Этот предварительный просмотр удаляет поддержку для HTTP-клиента Apache. Если ваше приложение использует этот клиент и предназначено для Android 2.3 (уровень API 9) или выше, используйте вместо этого класс HttpURLConnection. Этот API более эффективен, поскольку он снижает использование сети благодаря прозрачному кешированию сжатия и ответа и минимизирует потребление энергии

Поэтому вам лучше использовать HttpURLConnection :

  URL url = new URL("http://www.android.com/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); try { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); readStream(in); finally { urlConnection.disconnect(); } } 

Другой вариант – использовать сетевую библиотеку. Я лично использую Fuel на свой код Kotlin (но у него есть поддержка Java) и Http-запрос на моем Java-коде. Обе библиотеки используют внутреннее соединение HttpURLConnection .

Ниже приведен пример подключения с использованием библиотеки Http-Request :

 HttpRequest request = HttpRequest.get("http://google.com"); String body = request.body(); int code = request.code(); 

И вот пример подключения с использованием библиотеки Fuel :

 Fuel.get("http://httpbin.org/get", params).responseString(new Handler<String>() { @Override public void failure(Request request, Response response, FuelError error) { //do something when it is failure } @Override public void success(Request request, Response response, String data) { //do something when it is successful } }); 

Примечание. Fuel представляет собой асинхронную библиотеку, Http-request блокируется.

Вот мой полный пример:

 import android.util.Log; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.List; public class JSONParser { static InputStream is = null; static JSONObject json = null; static String output = ""; // constructor public JSONParser() { } public JSONObject getJSONFromUrl(String url, List params) { URL _url; HttpURLConnection urlConnection; try { _url = new URL(url); urlConnection = (HttpURLConnection) _url.openConnection(); } catch (MalformedURLException e) { Log.e("JSON Parser", "Error due to a malformed URL " + e.toString()); return null; } catch (IOException e) { Log.e("JSON Parser", "IO error " + e.toString()); return null; } try { is = new BufferedInputStream(urlConnection.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder total = new StringBuilder(is.available()); String line; while ((line = reader.readLine()) != null) { total.append(line).append('\n'); } output = total.toString(); } catch (IOException e) { Log.e("JSON Parser", "IO error " + e.toString()); return null; } finally{ urlConnection.disconnect(); } try { json = new JSONObject(output); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return json; } } 

Учитывая полезную нагрузку, которая возвращает {"content": "hello world"} , используйте вот так:

 JSONParser jsonParser = new JSONParser(); JSONObject payload = jsonParser.getJSONFromUrl( "http://yourdomain.com/path/to/your/api", null); System.out.println(payload.get("content"); 

Он должен распечатать "hello world" в вашей консоли.