- Какую библиотеку работы с HTTP в Android выбрать?
- Для чего это вообще?
- Немного истории
- Android OkHttp3 Http Get Post Request Example
- 1. OKHttp Characters.
- 2. Add OkHttp3 Library In build.gradle.
- 2. Use OkHttp3 To Create HTTP Get Request Method Call Object.
- 3. Use OkHttp3 To Create HTTP Post Request Method Call Object.
- 4. Send Http Request Synchronously And Asynchronously.
- 5. OkHttp Get Post Request Example.
- Android HTTP requests made easy
- Adding permissions
- Method 1: Creating custom classes
- HttpManager
- Putting it all together
- Method 2: Android Asynchronous HTTP Client
- Creating the MainActivity
- Conclusion
- Сделать POST-запрос к Api в Android Studio
Какую библиотеку работы с HTTP в Android выбрать?
Представляю вашему вниманию перевод статьи «Which Android HTTP library to use?».
Для чего это вообще?
Немного истории
До Froyo HttpURLConnection имел некоторые не очень приятные баги. В частности, вызов close() у читаемого InputStream мог испортить пул соединений.
… большой размер их API мешает нам улучшать эту библиотеку без потери обратной совместимости. Команда Android не работает активно над Apache HTTP Client.
Apache HTTP client имеет мало багов на Eclair и Froyo, поэтому он является лучшим выбором для этих версий. А для Gingerbread и младше лучше подходит HttpURLConnection. Простота API и небольшой вес хорошо подходят для Android. Прозрачное сжатие и кэширование ответов помогают увеличить скорость и сохранить батарею. Новые приложения должны использовать HttpURLConnection.
Даже сегодня, если вы загляните в исходники Volley от Google (о ней я расскажу чуть попозже), вы сможете найти такое наследие:
Это классический пример фрагментации Android, которая заставляет страдать разработчиков. В 2013 году Square обратила внимание на эту проблему, когда выпускала OkHttp. OkHttp была создана для прямой работы с верхним уровнем сокетов Java, при этом не используя какие-либо дополнительные зависимости. Она поставляется в виде JAR-файла, так что разработчики могут использовать ее на любых устройствах с JVM (куда мы включаем, конечно, и Android). Для упрощения перехода на их библиотеку, Square имплементировали OkHttp используя интерфейсы HttpUrlConnection и Apache client.
OkHttp получила большое распространение и поддержку сообществом, и, в конце-концов, Google решили использовать версию 1.5 в Android 4.4 (KitKat). В июле 2015 Google официально признала AndroidHttpClient, основанный на Apache, устаревшим, вместе с выходом Android 5.1 (Lolipop).
Сегодня OkHttp поставляется со следующим огромным набором функций:
- Поддержка HTTP/2 и SPDY позволяет всем запросам, идущим к одному хосту, делиться сокетом
- Объединение запросов уменьшает время ожидания (если SPDY не доступен)
- Прозрачный GZIP позволяет уменьшить вес загружаемой информации
- Кэширование ответов позволяет избежать работу с сетью при повторных запросах.
- Поддержка как и синхронизированных блокирующих вызовов, так и асинхронных вызовов с обратным вызовом (callback)
Моя самая любимая часть OkHttp – как красиво и аккуратно можно работать с асинхронными запросами:
Это очень удобно, так как работа с сетью не должна быть в UI потоке. По-факту, начиная с Android 3.0 (Honeycomb, API 11), работа с сетью в отдельном потоке стала обязательной. Для того, чтобы воплотить что-то похожее с HtttpUrlConnection, вам потребуется построить большую (а может и монструозную) конструкцию с использованием AsyncTask или отдельного потока. Это будет еще более сложным, если вы захотите добавить отмену загрузки, объединение соединений и т.п.
Кстати, не осталась у обочины и HTTP библиотека от Google под названием Volley, которая предоставляет нам следующие бонусы:
- Автоматическое планирование сетевых запросов
- Множество параллельных сетевых соединений
- Прозрачное кэширование в памяти и на диске, в соответствии со стандартной кэш-согласованностью.
- Поддержка приоритизации запросов.
- Отмена API запросов. Вы можете отменить как один запрос, так и целый блок.
- Простота настройки, например, для повторов и отсрочек.
- Строгая очередность, которая делает легким корректное заполнение данными, полученными асинхронно из сети, интерфейса пользователя.
- Инструменты отладки и трассировки
Все, что ни есть в Volley, находится на вершине HttpUrlConnection. Если вы хотите получить JSON или изображение, то Volley имеет на это специальный абстракции, такие как ImageRequest и JsonObjectRequest, которые помогают вам в автоматическом режиме конвертировать полезную нагрузку HTTP. Так же достойно внимания то, что Volley использует жестко запрограммированный размер сетевого пула:
Когда OkHttp использует поток для каждого вызова с ThreadPoolExecutor с максимальным значением Integer.MAX_VALUE:
В результате, в большинстве случаев OkHttp будет действовать быстрее за счет использования бОльшего количества потоков. Если по каким-то причинам вы захотите использовать OkHttp вместе Volley, то есть реализация HttpStack, которая использует API запросов/ответов из OkHttp заместо HttpURLConnection.
HTTP клиенты продолжили развиваться для поддержки приложений с большим количеством картинок, особенно тех, кто поддерживает бесконечную прокрутку и трансформацию изображений. В то же время, REST API стал стандартом в индустрии, и каждый разработчик имел дело с такими типовыми задачами как сериализация в/из JSON и преобразование REST-вызовов в интерфейсы Java. Не прошло много времени, как появились библиотеки, решающие эти задачи:
- Retrofit – типобезопасный HTTP Android клиент для взаимодействия с REST-интерфейсами
- Picasso – мощная библиотека для загрузки и кэширования изображений под Android
Retrofit предоставляет некий мост между Java кодом и REST-интерфейсом. Он позволяет быстро включить в ваш проект HTTP API интерфейсы, и генерирует самодокументирующуюся реализацию.
В дополнение ко всему, Retrofit поддерживает конвертацию в JSON, XML, протокол буферов (protocol buffers).
Picasso, с другой стороны, предоставляет HTTP библиотеку, ориентированную на работу с изображениями. Например, вы можете загрузить изображение в свой View с помощью одной строчки:
Picasso и Retrofi настроены так, чтобы использовать OkHttpClient как стандартный HTTP клиент. Однако, если хотите, вы можете указать клиентом HttpURLConnection.
Glide – что-то похожее на Picasso. Он предоставляет некоторые дополнительные функции, такие как GIF-анимация, генерация миниатюрных эскизов изображения и неподвижные видео. Полное сравнение можно найти здесь.
Facebook недавно открыли общественности исходный код библиотеки Fresco, которую они используют в своем мобильном приложении. Одна из ключевых функций, которая выделяет ее, — кастомная стратегия выделения памяти для bitmap’ов, чтобы избежать работы долгого GC (сборщик мусора). Fresco выделяет память в регионе, который называется ashmem. Используются некие трюки, чтобы иметь доступ к этому региону памяти доступ как из части, написанной на C++, так и из части на Java. Чтобы уменьшить потребление CPU и данных из сети, эта библиотека использует 3 уровня кэша: 2 в ОЗУ, третий во внутреннем хранилище.
Я нашел необходимым показать отношения между библиотеками на одной схеме. Как вы можете увидеть, HTTP всегда остается внизу у высокоуровневых библиотек. Вы можете выбирать между простым HttpUrlConnection или последним OkHttpClient. Мы используем эту совместимость при разработке PacketZoom Android SDK, о котором мы поговорим в следующем посте.
Недавно мы сравнивали между собой HTTP библиотеки по производительности, но эта тема заслужила отдельного рассмотрения. Мы надеемся, что этот обзор дал вам основные идеи о плюсах и минусах каждой библиотеки, и мы помогли вам сделать правильный выбор. Следите за выходом более интересных постов о сетевой работе в Android от нас.
Источник
Android OkHttp3 Http Get Post Request Example
This example will show you how to use OkHttp3 to send get or post HTTP request to a web server and how to parse and display response text in an Android TextView.
1. OKHttp Characters.
- OkHttp3 is a third-party open-source library that is contributed by the square company. It has below characters.
- User-friendly API.
- Support http2, sharing the same socket for all requests from a machine.
- Built-in connection pool, support for connection reuse, and reduction of delay.
- Supports transparent gzip compression response.
- Avoid duplicate requests by caching.
- Automatically retry the host’s other IP and redirect automatically when the request fails.
2. Add OkHttp3 Library In build.gradle.
- Before you can use the OkHttp3 library, you need to add dependencies in the build.gradle file in android studio as below.
- You can get the most recent build library from https://github.com/square/okhttp.
- After adding the below code, you need to click the Sync Now link in the top right corner to sync the project.
2. Use OkHttp3 To Create HTTP Get Request Method Call Object.
- The below source code snippet will use the OkHttp3 library to create an HTTP GET request.
3. Use OkHttp3 To Create HTTP Post Request Method Call Object.
- The below source code snippet will use the OkHttp3 library to create an HTTP POST request.
4. Send Http Request Synchronously And Asynchronously.
- You can send HTTP GET or POST requests with OkHttp3 synchronously or asynchronously.
- When you send the request synchronously, you need to run the code in a child thread because the process may take a long time.
- When you send the request asynchronously, the system will create a child thread and run OkHttp3 code in it automatically.
5. OkHttp Get Post Request Example.
Источник
Android HTTP requests made easy
If you’ve ever had to make an HTTP network request in Android, you know what a pain it can be. Making Android HTTP requests usually involves writing a lot of boilerplate code. You could make things a bit easier by creating some custom classes, but it can still be tedious.
In this tutorial I will show you how to make network requests using two different methods. The first method involves creating custom classes, which will aid in code reusability. The second method involves adding a library called the Android Asynchronous Http Client by loopj. This library will greatly reduce the amount of code you will need to write.
In addition, we will be making a network request to the BitcoinAverage API which returns a JSON string. You will learn how to handle the JSON string, both with and without the use of the Android Asynchronous Http Client library.
This tutorial is for those who:
- are comfortable with the Android development environment;
- want to learn an easier way to make HTTP requests in Android.
Note: you should also be comfortable with Java and how Object-Orientation works in Java.
Adding permissions
This step is relevant to both methods. Navigate to your AndroidManifiest.xml file and add the following permission before the tag:
Method 1: Creating custom classes
The first class we will be creating is called the RequestPackage class. This class will accept three important values when making HTTP requests. First, it will receive the URL. Next, it will receive the request method (POST or GET). Last, it will receive any values that the server might need (e.g. product_id). The request package will then be sent to the HttpManager class that we will create later.
Create a class called RequestPackage and add the following code to the class:
HttpManager
Next, we will create the HttpManager class. As mentioned earlier, the HttpManager receives the RequestPackage that we created in the previous section. The HttpManager is responsible for making the actual request and receiving the response from the server.
Create a class called HttpManager and add the following code to it:
Putting it all together
Finally, we can use the code we just implemented. Here we will be putting everything together within the MainActivity. We will have to create a private class within the MainActivity and we will call it Downloader.
The Downloader class is an AsyncTask, which is required when making network requests in Android. If you try to make network requests outside an AsyncTask, your UI will freeze until it gets the HTTP response from the server.
Create an activity called MainActivity and add the following code:
And we are done. The amount of code we needed to write in order to get those three small pieces of information is a lot. It gets even worse if you want to use something like a RecyclerView. That would involve creating an adapter, which would significantly increase the amount of code we need to write.
In the next section, I will show you how to do the same thing by making use of the Android Asynchronous Http Client.
Method 2: Android Asynchronous HTTP Client
Navigate to the app/build.gradle file and enter the code below in the dependencies section:
Android Studio will ask if you would like to sync your project. You should do this and the dependencies will be downloaded.
Creating the MainActivity
Next, you will need to add the code below to the MainActivity:
Run your app and, voila, you’re done.
Conclusion
Well done! You have completed this tutorial. As you can see, the amount of code needed when working with the Android Asynchronous Http Client is far less than making HTTP requests using no library.
You now have a choice to make: do you prefer method 1 or method 2?
To find out more about the Android Asynchronous Http Client, please visit: http://loopj.com/android-async-http/
To view and/or clone a similar project to the one in this tutorial – that also uses the Android Asynchronous Http Client – please visit: https://github.com/londonappbrewery/bitcoin-ticker-android-citispy
To find out more about the BitcoinAverage API, please visit: https://bitcoinaverage.com/
Find out more about our Certified Mobile Developer Bootcamp. You will cover the following modules: Java Programming Essentials, Introduction to Mobile Development and Advanced Mobile Developer.
This article was contributed by Yusuf Isaacs.
Editor’s note: This was post was originally published November 14th, 2017 and has been updated February 18th, 2019.
Источник
Сделать POST-запрос к Api в Android Studio
Я пытаюсь сделать запрос POST для API, который я создал в Visual Studio. API работает, и мне наконец-то удалось найти код, который позволяет мне подключаться к нему (и это не рекомендуется). Проблема в том, что этот код был создан для запроса GET, а мне нужно сделать POST. Я создал два блока, в которые вставляю данные, которые хочу передать (utente, пароль), и создал кнопку, которая берет данные из boxex и преобразует их в строку.
Я уже пробовал искать множество примеров и руководств, которые показывают, как сделать запрос POST, но большинство из них очень старые и больше не работают в Android Studio, или, по крайней мере, я не могу заставить их работать.
Теперь, это функция, которая должна отправлять данные, я не касался кода, так как не знаю, что изменить, кроме метода запроса.
Может кто-нибудь объяснить мне, как взять данные и отправить их как объект JSON, который имеет
Ключи = пользователь, пароль
Values = utente, password (значения взяты из двух упомянутых выше полей)
Спасибо всем, кто хочет помочь мне, и я надеюсь, что обращение за такой большой помощью не противоречит правилам сайта.
Я использую Волей, так как это не так сложно и потому что, кажется, работает.
Используя метод GET, он показывает, что существующий json с сообщением не может быть преобразован в объект JSON (мне все равно, это просто подтверждение того, что он подключается к API)
Используя метод POST, он выдает ErrorResponse в конце (источник еды не отвечает)
РЕДАКТИРОВАТЬ: добавлен метод OnCreate, поскольку мне нужно возвращение StringRequest
РЕДАКТИРОВАТЬ. Я следовал предложенному ответу, но он не работает .
Полученный код показан ниже, но я получаю OnErrorResponse, я не думаю, что это проблема с API, потому что при попытке получить ответ GET он дает мне выходной массив json, поэтому я думаю, что это проблема с кодом.
Источник