Библиотека HTTP, которая делает работу в сети для приложений Android проще и, что самое главное, быстрее.

Прочитав эту статью, вы научитесь вызывать REST API прямо из приложения Android. Мы будем использовать HTTP-библиотеку под названием Volley, которая официально поддерживается Android.

Основываясь на отзывах одного из читателей, Google отказался от этой библиотеки и больше не обновляет ее активно. Последний выпуск - 17 июля 2018 г. Пожалуйста, примите это во внимание, если вы планируете использовать его в своем проекте.

Согласно официальной документации,

«Volley превосходит операции типа RPC, используемые для заполнения пользовательского интерфейса, такие как выборка страницы результатов поиска в виде структурированных данных. Он легко интегрируется с любым протоколом и поставляется прямо из коробки с поддержкой необработанных строк, изображений и JSON. Предоставляя встроенную поддержку необходимых функций, Volley освобождает вас от написания шаблонного кода и позволяет сосредоточиться на логике, характерной для вашего приложения ».

В документации перечислены следующие преимущества:

  • Автоматическое планирование сетевых запросов
  • Несколько одновременных сетевых подключений
  • Прозрачное кэширование ответов диска и памяти со стандартной согласованностью кеш-памяти HTTP
  • Поддержка приоритизации запросов
  • API запроса отмены. Вы можете отменить один запрос, или вы можете установить блоки или области запросов для отмены
  • Легкость настройки, например, для повторной попытки и отката
  • Строгий порядок, позволяющий легко правильно заполнить пользовательский интерфейс данными, асинхронно полученными из сети.
  • Инструменты отладки и трассировки

Следовательно, Volley - чрезвычайно полезная библиотека для вызова REST API и передачи сетевых данных. Однако Volley не подходит для больших загрузок или потоковых операций, поскольку он сохраняет все ответы в памяти во время синтаксического анализа. Пожалуйста, рассмотрите другие альтернативы, такие как Диспетчер загрузок, если вам нужны потоковые операции.

В этом руководстве есть три раздела:

  1. Настраивать
  2. Реализация
  3. Заключение

1. Настройка

Убедитесь, что у вас установлена ​​Android Studio и необходимый SDK для разработки. Перейдите к build.gradle (Module: app) и добавьте следующий код внутри зависимостей:

implementation 'com.android.volley:volley:1.1.1'

Синхронизируйте файл gradle и дождитесь его завершения. Добавьте следующее разрешение в AndroidManifest.xml. Нам понадобится доступ в Интернет для отправки сетевых данных.

<uses-permission android:name="android.permission.INTERNET"/>

Перейдем к следующему разделу, чтобы начать работу над Android-проектом.

2. Реализация

Мы будем настраивать RequestQueue класс, который будет обслуживать наше приложение. Давайте создадим новый класс с именем RequestSingleton.java. Настоятельно рекомендуется использовать одноэлементный подход, который намного эффективнее.

Импортировать

Добавьте в класс следующий импорт.

import android.content.Context;
import android.graphics.Bitmap;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

Инициализация

Инициализируйте следующие переменные внутри вашего класса.

private static RequestSingleton instance;
private RequestQueue requestQueue;
private static Context ctx;

Одноэлементный объект

Создайте синхронизированный метод с именем getInstance. Мы передаем Context object в качестве параметра. Мы будем вызывать этот метод, чтобы получить синглтон.

public static synchronized RequestSingleton getInstance(Context context) {
    if (instance == null) {
        instance = new RequestSingleton(context);
    }
    return instance;
}

Конструктор

Создайте конструктор для RequestSingleton со следующей инициализацией. (Вы увидите ошибку, поскольку функция getRequestQueue еще не реализована.)

private RequestSingleton(Context context) {
    ctx = context;
    requestQueue = getRequestQueue();

}

Реализуйте отсутствующий метод getRequestQueue с помощью следующего кода.

public RequestQueue getRequestQueue() {
    if (requestQueue == null) {
        requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
    }
    return requestQueue;
}

Общий метод запроса

Когда вы закончите, продолжайте добавлять следующую общую функцию, чтобы гарантировать, что наш синглтон сможет поддерживать все виды Request.

public <T> void addToRequestQueue(Request<T> req) {
    //retry policy

    getRequestQueue().add(req);
}

Вы можете установить RetryPolicy, чтобы он не превышал тайм-аут, если для завершения вызова API требуется некоторое время. Добавьте следующее под комментарием, чтобы установить тайм-аут в одну секунду.

req.setRetryPolicy(new DefaultRetryPolicy(
        1000, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT))

Он принимает следующие параметры:

  • Timeout - указывает время ожидания сокета в миллисекундах на каждую повторную попытку.
  • Number Of Retries - Количество попыток повтора
  • Back Off Multiplier - множитель, который используется для определения экспоненциального времени, установленного для сокета для каждой попытки повтора.

StringRequest

Вернитесь к MainActivity.java и добавьте новую функцию. Он принимает входной параметр String. Давайте попробуем простой GET вызов с использованием встроенного StringRequest. Создайте новый объект StringRequest. Будет два события прослушивателя, в которых вы успешно получите ответ или запрос не прошел. Добавьте объект с помощью метода addToRequestQueue.

Сделайте вызов ConnectURL и передайте действительный URL. Вы должны увидеть обратную связь с сервера.

JSONObjectRequest

Если вы собираетесь выполнить POST запрос с данными JSON, вам нужно будет заранее создать JSONObject. Добавьте следующий импорт в верхнюю часть вашего проекта.

import org.json.JSONException;
import org.json.JSONObject;

Создайте новую функцию и инициализируйте JSONObject. Вам нужно вызвать функцию put, чтобы вставить в нее данные. Требуется заключить его в блок try-catch, чтобы зафиксировать JSONException ошибку. Измените данные соответствующим образом на основе принятого ввода вызова POST. Вы даже можете передать его через входные параметры функции. Остальная реализация аналогична StringRequest, за исключением того, что вы передадите переменную jsonObj при создании JsonObjectRequest.

Вы можете проверить это, вызвав функцию ConnectURLJson и передав действительный URL-адрес.

JSONObjectRequest с изображением

Отправка данных изображения немного сложна и требует преобразования в Base64. Прежде всего, получите соответствующее растровое изображение из вашего ImageView или любых локальных файлов. Преобразуйте его в байтовые массивы и закодируйте с помощью функции java.util.Base64. Теперь он в строковом формате, и вы можете легко добавить его в JSONObject.

Закодированная строка должна быть декодирована на сервере обратно в правильный формат.

3. Заключение

Подведем итоги тому, что мы узнали сегодня. Мы начали с простой настройки, добавив библиотеку в файл gradle. Затем мы добавили необходимое разрешение в Интернет внутри AndroidManifest.xml.

Затем мы создали новый одноэлементный класс, который предоставляет нам общий метод для добавления всех видов Request.

В части реализации мы попробовали три разных способа. Первый - это простой вызов GET с использованием StringRequest. За ним последовал вызов POST, который принимает JSONObject. Наконец, мы также попытались отправить данные изображения в виде строки Base64.

Спасибо, что прочитали эту статью. Надеюсь увидеть вас снова в следующей статье!

Ссылка