Здравствуйте, хабровчане!

Когда занимаешься разработкой сетевых приложений под платформу Android, понимаешь, что одно и другое приложение похоже друг на друга. С этой мыслью у большинства разработчиков инициализируется и другая мысль — «Почему бы мне не использовать какие-либо готовые решения, ведь явно моя задача не нова?». С этого момента начинается поиск подходящих библиотек для решения актуального на сей момент вопроса. По истечению некоторого времени — профит. Казалось бы всё хорошо, ведь библиотека найдена и осталась только написать реализацию решения текущего вопроса. И тут начинаются проблемы. Связаны они с управлением потоков, да и вообще Java никогда не славилась своей компактностью, все «волшебство» должно быть реализовано непосредственно разработчиком. Порой я нахожу в этом только положительные стороны, ведь логика каждого проекта отличается друг от друга кардинально. Вам постоянно приходится переключатся с потока на поток, что не очень удобно и как описывалось ранее — получается громоздко. Решение данной проблемы было реализовано и ранее, но не столь компактно, как хотелось бы. На помощь приходит библиотека для работы с HTTP — GridmiAPI. Это максимально компактное решение, которое в свою очередь позволяет оперировать данными в реальном времени.

Рабочий процесс


Вся работа библиотеки начинается с её инициализации. Инициализация требуется единожды. Под инициализацией понимается следующая конструкция:

GridmiAPI.init("https://habr.com/API/", 8000, JSONObject.class);

  1. Адрес конечного узла обработки запросов
  2. Время ожидания ответа сервера
  3. Класс, к типу которого должен быть приведен ответ сервера

Вот и всё! Библиотека готова к полноценному использованию.

Первый запрос к серверу


Чтобы выполнить первый запрос к серверу, требуется написать всего несколько строк кода и требуемые нами данные у нас. Не верите? Смотрите:

GridmiAPI.onRequest(this, new GridmiAPI.Request("profile/get"), new GridmiAPI.Handler.OUT() {
    
    @Override
    protected void onSuccess(GridmiAPI.Response response) {
        Log.d("TagGridmiAPI", "result = " + ((JSONObject) response.getData()).toString());
    }

    @Override
    protected void onFailed(Exception exception) {
        Log.d("TagGridmiAPI", "exception = " + exception.getMessage());
    }
    
}).start();

Поздравляю! Это Ваш «Hello world!» с использованием данной библиотеки. Давайте рассмотрим два переписанных метода класса GridmiAPI.Handler.OUT. Для начала следует написать, что эти два метода вызываются в основном потоке, поэтому по завершению запроса нет смысла обращаться к активности чтобы запустить основной поток. Вы просто берете JSON к примеру и меняете текст TextView. Все просто.

Отправить файл на сервер


Очень часто приходится отправлять файлы на сервер. Вновь головная боль? Никак нет. Библиотека GridmiAPI позволяет очень просто отправить файл без головной боли. Чуть больше строк чем в примере выше, но все так же компактно. Вот как можно отправить файл:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    
    super.onActivityResult(requestCode, resultCode, data);
    if (data == null || data.getData() == null) return;

    try {

        // Экземпляр запроса к серверу
        GridmiAPI.Request request = new GridmiAPI.Request("POST", "photo/add");

        // Создаем экземпляр многосоставного тела запроса
        GridmiAPI.Multipart multipart = new GridmiAPI.Multipart(getContentResolver());
        multipart.appendData("photo", data.getData());
        
        // Установить тело запроса
        request.setBody(multipart);
        
        // Отправить запрос
        GridmiAPI.onRequest(this, request, new GridmiAPI.Handler.OUT() {

            @Override
            protected void onSuccess(GridmiAPI.Response response) {
                try {
                    
                    // Получить результат с тела запроса
                    boolean result = ((JSONObject) response.getData()).getBoolean("result");
                    
                    // Уведомление
                    Toast.makeText(MainActivity.this, result ? "Загружено!" : "Ошибка!", Toast.LENGTH_LONG).show();
                    
                } catch (Exception exception) {
                    this.onFailed(exception);
                }
            }

            @Override
            protected void onFailed(Exception exception) {
                // Уведомление о текущем исключении
                Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
            }

        }).start();

    } catch (Exception exception) {
        Toast.makeText(this, exception.getMessage(), Toast.LENGTH_LONG).show();
    }

}

Заключение


Мы рассмотрели самые популярные задачи, более детально Вы можете ознакомится на странице данной библиотеки на GitHub — GridmiAPI. Работать с данной библиотекой комфортно. Оцените сами. Спасибо Вам за то, что проявили интерес к данной статье!

Ссылки


Библиотека GridmiAPI
Документация / ReadMe.md

Комментарии (7)


  1. advance
    08.10.2019 13:51

    Альтернативы- это всегда хорошо. А есть ли у этой библиотеки преимущества в сравнении с OkHttp? Он стал сейчас практически стандартом в разработке под Android. Например, если смотреть на создание запросов- я большой разницы не вижу


  1. anegin
    09.10.2019 00:41

    Хм. Пока не совсем понятно преимуществ. Не проще и не функциональнее упомянутого выше okhttp. Как минимум нет interceptorов (для логирования, авторизации и т.п.), sslfactory. Не совсем понятно, что под капотом, насколько решены проблемы совместимости с разными версиями андроида. И не всегда нужно получать callback в main-потоке — тот же парсинг json по-хорошему нужно делать не выходя из io-потока. А если еще притянуть архитектурные подходы… И почему в заголовке упомянуты rest/rpc, ведь библиотека не об этом


    1. Gridmi Автор
      09.10.2019 10:59

      Здравствуйте! Не обязательно входить в MAIN, можете оставаться в фоне. Для этого потребуется обратиться к методу GridmiAPI.onRequest(request);


  1. angryrobot
    09.10.2019 07:22

    Почему бы просто не использовать Retrofit?


    1. Gridmi Автор
      09.10.2019 11:02

      Как писали выше, альтернативы — это хорошо. Быть может кому-то пригодиться.


  1. Alex837
    09.10.2019 07:22

    Какие у нее преимущества перед Retrofit?


    1. anegin
      09.10.2019 12:39

      Retrofit — это только про REST. Тут корректнее сравнивать с OkHttp, Volley