1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/troyzhxu-httputils

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-2.1.2.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 02:06 bb668ec

Когда используется метка, можно отменить HTTP-задачи по меткам:

int count = http.cancel("B");              // (2) (3) (4) будут отменены (отменяются задачи с меткой «B»)
System.out.println(count);                 // вывод 3

Также метки могут использоваться в препроцессорах, см. разделы «Параллельный препроцессор» и «Последовательный препроцессор».

6 Настройка HTTP

6.1 Установка BaseUrl

HTTP http = HTTP.builder()
        .baseUrl("http://api.demo.com")    // установка BaseUrl
        .build();

Эта конфигурация действует глобально. После настройки BaseUrl конкретные запросы могут опускать часть BaseUrl, что делает код более кратким, например:

http.sync("/users").get()                  // http://api.demo.com/users

http.sync("/auth/signin")                  // http://api.demo.com/auth/signin
        .addBodyParam("username", "Jackson")
        .addBodyParam("password", "xxxxxx")
        .post()                            // POST запрос

После настройки BaseUrl для особых задач всё ещё можно использовать полный путь, это не мешает:

http.sync("https://www.baidu.com").get()

6.2 Обработчик обратного вызова

Если вы хотите изменить поток выполнения функции обратного вызова, вы можете настроить обработчик обратного вызова. Например, в Android, чтобы все функции обратного вызова выполнялись в потоке пользовательского интерфейса, при построении HTTP можно настроить следующим образом:

HTTP http = HTTP.builder()
        .callbackExecutor((Runnable run) -> {
            runOnUiThread(run);            // выполнение в потоке UI
        })
        .build();

На эту конфигурацию влияют обратные вызовы: OnResponse, OnException и OnComplete.

6.3 Настройка OkHttpClient

В отличие от других оболочек OkHttp, HttpUtils не скрывает полезные функции OkHttp:

HTTP http = HTTP.builder()
    .config((Builder builder) -> {
        // настройка пула соединений минимум 10 соединений (по умолчанию 5)
        builder.connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES));
        // настройка времени ожидания соединения
        builder.connectTimeout(20, TimeUnit.SECONDS);
        // настройка перехватчика
        builder.addInterceptor((Chain chain) -> {
            Request request = chain.request();
            // обязательно синхронное возвращение, перехватчики не могут выполнять асинхронные операции
            return chain.proceed(request);
        });
        // другие настройки: SSL, кэш, прокси, прослушивание событий...
    })
    .build();

6.4 Параллельный препроцессор

Препроцессор (Preprocessor) позволяет нам изменять запросы перед их отправкой, но он отличается от перехватчиков (Interceptor): препроцессор может обрабатывать запросы асинхронно.

Например, если мы хотим автоматически добавить заголовок Token к запросу, а Token можно получить только асинхронным методом requestToken, то перехватчики трудно использовать, но препроцессор легко решает проблему:

HTTP http = HTTP.builder()
        .addPreprocessor((Process process) -> {
            HttpTask<?> task = process.getTask();// получение текущего HTTP-запроса
            if (!task.isTagged("Auth")) {        // проверка необходимости Token для этой задачи
                return;
            }
            requestToken((String token) -> {     // асинхронный запрос Token
                task.addHeader("Token", token);  // добавление заголовка к задаче
                process.proceed();               // продолжение текущей задачи
            });
        })
        .build();

Как и перехватчики, препроцессоры также могут быть добавлены в нескольких экземплярах.

6.5 Последовательный препроцессор

Обычные препроцессоры могут обрабатываться параллельно, но иногда мы хотим, чтобы один препроцессор обрабатывал только одну задачу за раз. Например, когда Token истекает, мы должны обновить его, и обновление Token может выполняться только одной задачей за раз, потому что если несколько задач попытаются обновить Token одновременно, то n-1 задач могут сразу же использовать просроченный Token. Это нежелательно.

Чтобы решить эту проблему, HttpUtils предоставляет последовательный препроцессор, который позволяет задачам выстраиваться в очередь и входить в препроцессор по очереди:

HTTP http = HTTP.builder()
        .addSerialPreprocessor((Process process) -> {
            HttpTask<?> task = process.getTask();
            if (!task.isTagged("Auth")) {
                return;
            }
            // проверка истечения срока действия, обновление Token при необходимости
            requestTokenAndRefreshIfExpired((String token) -> {
                task.addHeader("Token", token);            
                process.proceed();               // вызов этого метода до того, как любая другая задача войдёт в этот обработчик
            });
        })
        .build();

Последовательные препроцессоры реализуют функцию обработки запросов по очереди, но стоит отметить, что они не блокируют никакие потоки!

7 Использование класса HttpUtils

Класс HttpUtils изначально был самым важным классом в версии 1.x, но после выделения интерфейса HTTP в версии 2.x его важность снизилась. Однако его разумное использование всё ещё может принести много пользы, особенно в средах без контейнеров IOC, таких как разработка для Android и некоторых инструментов.

Класс HttpUtils определяет четыре статических метода:

  • async(String url) — начать асинхронный запрос (через одноэлементный экземпляр HTTP);
  • sync(String url) — начать синхронный запрос (через одноэлементный экземпляр HTTP);
  • cancel(String tag) — отменить запрос по метке (через одноэлементный экземпляр HTTP);
  • of(HTTP http) — настроить экземпляр HttpUtils, который содержит экземпляр HTTP (без вызова этого метода используется экземпляр HTTP, который не прошёл никакой конфигурации).

То есть везде, где можно использовать экземпляр http, можно использовать класс HttpUtils. Например:

// до настройки экземпляра HTTP можно использовать только полный путь
List<Role> roles =

``` ```
HttpUtils.sync("http://api.demo.com/roles")
        .get().getBody().toList(Role.class);

// 配置HTTP实例,全局生效
HttpUtils.of(HTTP.builder()
        .baseUrl("http://api.demo.com")
        .build());

// 内部使用新的HTTP实例
List<User> users = HttpUtils.sync("/users")
        .get().getBody().toList(User.class);

Участие в проекте

  1. Форк этого репозитория.
  2. Создать ветку Feat_xxx.
  3. Зафиксировать код.
  4. Создать Pull Request.

Навыки работы с Code Cloud

  1. Использование Readme_XXX.md для поддержки разных языков, например Readme_en.md, Readme_zh.md.
  2. Официальный блог Code Cloud: blog.gitee.com.
  3. Вы можете посетить адрес https://gitee.com/explore, чтобы узнать о выдающихся проектах с открытым исходным кодом на Code Cloud.
  4. GVP — это аббревиатура от «Наиболее ценные проекты с открытым исходным кодом Code Cloud», которая представляет собой список выдающихся проектов с открытым исходным кодом, отобранных Code Cloud.
  5. Официальное руководство по использованию Code Cloud: https://gitee.com/help.
  6. «Звёзды Code Cloud» — это раздел, предназначенный для демонстрации талантов участников Code Cloud: https://gitee.com/gitee-stars/.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/troyzhxu-httputils.git
git@api.gitlife.ru:oschina-mirror/troyzhxu-httputils.git
oschina-mirror
troyzhxu-httputils
troyzhxu-httputils
master