Когда используется метка, можно отменить HTTP-задачи по меткам:
int count = http.cancel("B"); // (2) (3) (4) будут отменены (отменяются задачи с меткой «B»)
System.out.println(count); // вывод 3
Также метки могут использоваться в препроцессорах, см. разделы «Параллельный препроцессор» и «Последовательный препроцессор».
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()
Если вы хотите изменить поток выполнения функции обратного вызова, вы можете настроить обработчик обратного вызова. Например, в Android, чтобы все функции обратного вызова выполнялись в потоке пользовательского интерфейса, при построении HTTP
можно настроить следующим образом:
HTTP http = HTTP.builder()
.callbackExecutor((Runnable run) -> {
runOnUiThread(run); // выполнение в потоке UI
})
.build();
На эту конфигурацию влияют обратные вызовы: OnResponse
, OnException
и OnComplete
.
В отличие от других оболочек 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();
Препроцессор (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();
Как и перехватчики, препроцессоры также могут быть добавлены в нескольких экземплярах.
Обычные препроцессоры могут обрабатываться параллельно, но иногда мы хотим, чтобы один препроцессор обрабатывал только одну задачу за раз. Например, когда 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();
Последовательные препроцессоры реализуют функцию обработки запросов по очереди, но стоит отметить, что они не блокируют никакие потоки!
Класс 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);
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )