BaseOkHttpV3
Демонстрация эффекта не представлена в запросе.
allprojects {
repositories {
maven {
url 'https://s01.oss.sonatype.org/content/repositories/releases/'
}
}
}
dependencies {
implementation('com.gitee.chinasoft_ohos:BaseOkHttpV3:1.0.1')
......
}
Проект можно запустить на SDK6 и DevEco Studio 2.2 Beta1 без дополнительных настроек. Если проект не запускается, удалите файлы .gradle, .idea, build, gradle, build.gradle и создайте новый проект с соответствующей версией. Затем скопируйте файлы из нового проекта в корневой каталог.
1.1 Создание запроса с использованием параметров:
HttpRequest.POST(context, "http://你的接口地址", new Parameter().add("page", "1"), new ResponseListener() {
@Override
public void onResponse(String response, Exception error) {
progressDialog.dismiss();
if (error == null) {
resultHttp.setText(response);
} else {
resultHttp.setText("请求失败");
}
}
});
Здесь Parameter — это объект, который представляет собой обёртку над Map. Его можно преобразовать в текстовую строку с разделением параметров по ключу и соединением их символом «&» с помощью метода toParameterString() или в JSONObject с помощью toParameterJson().
В общем запросе метод HttpRequest.POST(...) используется для создания POST-запроса, а HttpRequest.GET(...) — для GET-запроса. Также можно добавить дополнительные заголовки с помощью методов addHeaders(), addParameter() и setResponseListener().
1.2 Создание запроса с использованием потокового кода:
HttpRequest.build(context,"http://你的接口地址")
.addHeaders("Charset", "UTF-8")
.addParameter("page", "1")
.addParameter("token", "A128")
.setResponseListener(new ResponseListener() {
@Override
public void onResponse(String response, Exception error) {
progressDialog.dismiss();
if (error == null) {
resultHttp.setText(response);
} else {
resultHttp.setText("请求失败");
}
}
})
.doPost();
Возвращаемый слушатель имеет только один параметр, в котором проверяется наличие ошибки. Если ошибка отсутствует, запрос считается успешным, иначе — неудачным. Данные успешного запроса сохраняются в параметре response.
Основная причина объединения успешного и неудачного выполнения запроса в одном слушателе — удобство обработки кода, который должен выполняться независимо от результата запроса, например, закрытие диалогового окна ожидания (dismiss).
Для прямого анализа возвращаемых данных как объекта jsonMap используйте JsonResponseListener:
HttpRequest.POST(context, "/femaleNameApi", new Parameter().add("page", "1"), new JsonResponseListener() {
@Override
public void onResponse(JsonMap main, Exception error) {
if (error == null) {
resultHttp.setText(main.getString("msg"));
} else {
resultHttp.setText("请求失败");
}
}
});
1.3 О возвращаемом потоке
BaseOkHttpV3 автоматически определяет необходимость возврата потока. Обычно вам не нужно беспокоиться об этом. Вы можете выполнять операции пользовательского интерфейса непосредственно в обратном вызове запроса.
Процесс запроса BaseOkHttpV3 является асинхронным (многопоточным), а после возврата данных он определяется контекстом, следует ли выполнять его в асинхронном потоке или потоке пользовательского интерфейса. Когда контекст является Ability, данные возвращаются в потоке пользовательского интерфейса по умолчанию, и нет необходимости обрабатывать потоки вручную. Однако, когда контекст не является PageAbility, таким как ApplicationContext или Service, данные будут возвращены в асинхронный поток. Если необходимо изменить элементы отображения в пользовательском интерфейсе, необходимо вручную переключиться на основной поток для обновления компонентов пользовательского интерфейса.
Это оптимальное решение, основанное на нашем обширном исследовании сценариев использования. Однако если объём возвращаемых данных слишком велик, это может привести к зависанию потока пользовательского интерфейса. В этом случае рекомендуется использовать AbilityPackage при передаче контекста для принудительного возврата в асинхронный поток, а затем использовать PageAbility для переключения на основной поток и обновления пользовательского интерфейса после обработки данных.
Иногда нам нужно использовать уже обработанный текст JSON в качестве параметра запроса. В этом случае вы можете использовать метод HttpRequest.JSONPOST(...):
json-запрос использует текстовый тип параметра. Запрос создаётся следующим образом:
HttpRequest.JSONPOST(context, "http://你的接口地址", "{\"key\":\"DFG1H56EH5JN3DFA\",\"token\":\"124ASFD53SDF65aSF47fgT211\"}", new ResponseListener() {
@Override
public void onResponse(String response, Exception error) {
progressDialog.dismiss();
if (error == null) {
resultHttp.setText(response);
} else {
resultHttp.setText("请求失败");
}
``` **7.1 Запрос автоматически возвращает JsonMap**
Используя JsonResponseListener в качестве возвращаемого слушателя, можно напрямую обрабатывать объект JsonMap при возврате:
HttpRequest.POST(context, "/femaleNameApi", new Parameter().add("page", "1"), new JsonResponseListener() { @Override public void onResponse(JsonMap main, Exception error) { progressDialog.dismiss(); if (error == null) { resultHttp.setText(main.toString()); } else { resultHttp.setText("Запрос не удался"); } } });
Также можно написать так:
HttpRequest.build(context, "/femaleNameApi") .addParameter("page", "1") .setJsonResponseListener(new JsonResponseListener() { @Override public void onResponse(JsonMap main, Exception error) { progressDialog.dismiss(); if (error == null) { resultHttp.setText(main.toString()); } else { resultHttp.setText("Запрос не удался"); } } });
Обратите внимание, что для предотвращения исключения нулевого указателя, даже если запрос не удался, значение error!=null, возвращаемый main всё равно не будет нулевым указателем, а будет пустым объектом JsonMap, который можно проверить с помощью метода .isEmpty().
**7.2 Для неизвестного Json-текста**
Object obj = JsonUtil.deCodeJson(JsonStr);
Метод deCodeJson предоставляет возможность использования, когда целевая строка является JsonArray или JsonObject, и возвращает объект Object. В этом случае необходимо выполнить проверку:
if(obj != null){ if (obj instanceof JsonMap){ // Этот объект является JsonObject, используйте метод get(...) для получения значений внутри него. } if (obj instanceof JsonList){ // Этот объект является JsonArray, используйте метод get(index) для получения элементов внутри него. } }
Обратите внимание на обработку объекта obj для проверки на пустоту. Если разбор не удастся, то вернётся null.
**7.3 Для известного JsonObject-текста**
JsonMap map = JsonUtil.deCodeJsonObject(JsonStr); // Непосредственно анализируется как объект Map, JsonMap наследуется от LinkedHashMap, хранит набор пар ключ-значение в порядке стека.
Обратите внимание на проверку map на пустоту, если разбор не удастся, вернётся null.
**7.4 Для известного JsonArray-текста**
JsonList list = JsonUtil.deCodeJsonArray(JsonStr); // Анализируется непосредственно как объект List, JsonList наследуется от ArrayList.
Обратите внимание на проверку list на пустоту, если разбор не удастся, вернётся null.
**7.5 Дополнительные пояснения**
Для удобства разбора, JsonMap и JsonList предоставляют соответствующие методы для получения значения внутренних элементов:
getString(...) getInt(...) getBoolean(...) getLong(...) getShort(...) getDouble(...) getFloat(...) getList(...) getJsonMap(...)
Обратите внимание, вы также можете использовать методы get(...), предоставляемые Map и List, для получения значений элементов, но методы, предоставляемые JsonMap и JsonList, возвращают значение по умолчанию для пустых указателей, например, для фактического значения null String возвращается пустая строка "", а для фактического элемента null получение его int значения равно 0.
Если вам нужна проверка на пустое значение, вы можете использовать, например, `getInt(String key, int emptyValue)` для выполнения этой операции. Если значение пустое, оно вернёт предоставленное вами emptyValue.
Этого действительно недостаточно строго, но в большей степени это делается для повышения эффективности разработки и адаптации к требованиям быстрого развития производства.
**8. Разбор JavaBean**
Функция обратного вызова для прямого анализа json в JavaBean:
При установке обратного вызова используйте BeanResponseListener и передайте нужный JavaBean в его дженерик. После этого вы сможете получить уже созданный и заполненный данными объект JavaBean в обратном вызове:
HttpRequest.POST(this, "/getWangYiNews", new Parameter() .add("page", "1") .add("count", 5) , new BeanResponseListener() { @Override public void onResponse(DataBean main, Exception error) { if (error == null) { Log.e(">>>", "onResponse: " + main); } else { error.printStackTrace(); } } } );
Объект JavaBean должен содержать соответствующие методы get и set для каждого свойства, и все имена должны соответствовать правилам именования верблюжьего регистра.
Поддерживаются данные типа boolean с методами получения данных, начинающимися с «is», например «boolean isVIP()» или «boolean getVIP()».
**9. Дополнительные функции**
**9.1 Глобальный журнал**
Глобальный переключатель журнала (по умолчанию выключен, необходимо включить вручную):
BaseOkHttp.DEBUGMODE = true;
BaseOkHttpV3 поддерживает расширенный журнал, и при использовании вывода содержимого журнала в виде строки json он автоматически форматируется для удобства просмотра.
Вы можете фильтровать журналы в Logcat с помощью символа «>>>» в фильтре (поле поиска в верхней части окна Logcat).
**9.2 Глобальный адрес запроса**
После установки глобального адреса запроса все интерфейсы могут быть напрямую доступны по относительному адресу, например:
BaseOkHttp.serviceUrl = "https://www.example.com";
Отправьте запрос:
HttpRequest.POST(context, "/femaleNameApi", new Parameter().add("page", "1"), new ResponseListener() {...});
Обратите внимание, что после установки глобального адреса запроса, если адрес параметра HttpRequest начинается с «http», глобальный адрес не будет добавлен.
**9.3 Глобальный заголовок запроса**
Используйте следующий код для предварительной настройки глобального заголовка запроса:
BaseOkHttp.overallHeader = new Parameter() .add("Charset", "UTF-8") .add("Content-Type", "application/json") .add("Accept-Encoding", "gzip,deflate") ;
Если необходимо обработать заголовок запроса в реальном времени, можно реализовать обработчик интерфейса, например следующий код, который выполняет операцию подписи над заголовком запроса:
BaseOkHttp.headerInterceptListener = new HeaderInterceptListener() { 9.4. Глобальный перехватчик ответов
Используя следующий код, можно установить глобальный перехватчик возвращаемых данных. Return true позволяет продолжить обработку запроса, return false — прерывает возврат исходного запроса для обработки:
BaseOkHttp.responseInterceptListener = new ResponseInterceptListener() {
@Override
public boolean onResponse(Context context, String url, String response, Exception error) {
if (error != null) {
return true;
} else {
Log.i("!!!", "onResponse: " + response);
return true;
}
}
};
У перехватчика ответов есть ещё две реализации: JsonResponseInterceptListener и BeanResponseInterceptListener. Они позволяют напрямую обрабатывать данные определённого формата ответа. Используются так же, как ResponseInterceptListener.
9.5. Поддержка HTTPS
BaseOkHttp.SSLInAssetsFileName = "test.cer";
...
Это позволит использовать запросы по протоколу HTTPS.
Кроме того, вы можете использовать BaseOkHttp.httpsVerifyServiceUrl=(boolean) для настройки проверки соответствия адреса хоста запроса и настроенного HttpRequest.serviceUrl.
9.6. Глобальные перехватчики параметров
Следующий код позволяет настроить глобальные перехватчики параметров. Этот перехватчик параметров может перехватывать и изменять или добавлять все параметры, передаваемые в запросе.
Для одного проекта перехватчик parameterInterceptListener является статическим, то есть уникальным. В настоящее время не поддерживается одновременное наличие нескольких типов запросов (например, параметров формы, JSON-параметров, строковых параметров) в одном проекте.
9.6.1. Для обычных параметров в форме запроса
Этот метод также подходит для сценариев, требующих шифрования параметров:
BaseOkHttp.parameterInterceptListener = new ParameterInterceptListener<Parameter>() {
@Override
public Parameter onIntercept(Context context, String url, Parameter parameter) {
parameter.add("key", "DFG1H56EH5JN3DFA");
parameter.add("sign", makeSign(parameter.toParameterString()));
return parameter; //Обратите внимание на необходимость возврата обработанных параметров
}
};
private String makeSign(String parameterString){
//Логика шифрования
...
}
Значение onIntercept включает контекст текущего запроса (context), адрес текущего запроса (url), параметры запроса (parameter). После обработки необходимо вернуть обработанные параметры (parameter).
9.6.2. Для параметров запроса в формате JSON
Используйте общий тип JsonMap для параметров:
BaseOkHttp.parameterInterceptListener = new ParameterInterceptListener<JsonMap>() {
@Override
public Parameter onIntercept(Context context, String url, JsonMap parameter) {
parameter.set("key", "DFG1H56EH5JN3DFA");
return parameter; //Обратите внимание на необходимость возврата обработанных параметров
}
};
Если это JsonArray, вы можете ограничить его типом JsonList:
BaseOkHttp.parameterInterceptListener = new ParameterInterceptListener<JsonList>() {
@Override
public Parameter onIntercept(Context context, String url, JsonList parameter) {
parameter.set("img1");
parameter.set("img2");
return parameter; //Обратите внимание на необходимость возврата обработанных параметров
}
};
9.6.3. Для других типов параметров, включая строки и XML
Ограничьте общий тип строкой (String):
BaseOkHttp.parameterInterceptListener = new ParameterInterceptListener<String>() {
@Override
public Parameter onIntercept(Context context, String url, String parameter) {
//Обработка параметра
return parameter; //Обратите внимание на необходимость возврата обработанных параметров
}
};
9.7. Тайм-аут запроса
С помощью следующего кода можно настроить тайм-аут для запросов (единица измерения: секунды):
BaseOkHttp.TIME_OUT_DURATION = 10;
После истечения времени ожидания запрос будет остановлен, а в параметре ошибки ответа будет возвращено TimeOutException().
9.8. Остановка запроса
Чтобы остановить процесс запроса, используйте следующий метод:
httpRequest.stop(); //Остановка запроса
9.9. Резервные адреса
Вы можете настроить резервные адреса с помощью BaseOkHttp.reserveServiceUrls.
Тип свойства — StringArray. Пример конфигурации:
BaseOkHttp.reserveServiceUrls = new String[]{
"https://www.testB.com",
"https://www.testC.com",
"https://api.testD.com"
};
Когда основной адрес сервера (BaseOkHttp.serviceUrl) недоступен, будут последовательно проверяться адреса из BaseOkHttp.reserveServiceUrls. Если все попытки завершатся неудачно, будет выполнен обратный вызов функции. Если один из адресов сможет успешно выполнить запрос, основной адрес сервера будет заменён на этот адрес, и последующие запросы будут выполняться на нём.
9.10. Cookie
Установите заголовок запроса Cookie:
httpRequest.setCookie(String);
Включите автоматическое сохранение и передачу файлов cookie, полученных от сервера:
BaseOkHttp.autoSaveCookies = true;
Получите сохранённый список файлов cookie:
httpRequest.getCookies();
9.11. Перехват повторяющихся запросов
Включите перехват повторяющихся запросов:
BaseOkHttp.disallowSameRequest = true;
После включения только один запрос с одинаковыми адресом и параметрами может быть отправлен одновременно. До завершения текущего запроса (успешно, неудачно или с тайм-аутом) невозможно отправить такой же запрос.
Если необходимо одновременно отправить несколько одинаковых запросов по адресу и параметрам, можно добавить временную метку для их различения.
Очистка списка повторяющихся запросов при необходимости:
BaseOkHttp.cleanSameRequestList();
9.12. Пользовательские OkHttpClient или OkHttpClient.Builder
BaseOkHttpV3 основан на OkHttp. Мы предоставляем автоматизированный OkHttpClient по умолчанию, но у вас может возникнуть потребность в настройке этих компонентов для реализации дополнительных функций.
Чтобы настроить OkHttpClient или OkHttpClient.Builder, сначала создайте запрос с помощью HttpRequest.build(context), затем используйте: Настройка пользовательских OkHttpClient и OkHttpClientBuilder
Для настройки пользовательских интерфейса используются методы setCustomOkHttpClient(CustomOkHttpClient)
и setCustomOkHttpClientBuilder(CustomOkHttpClientBuilder)
, которые позволяют модифицировать OkHttpClient.Builder и OkHttpClient перед отправкой запроса. Модифицированные компоненты необходимо вернуть в параметры интерфейса, чтобы изменения вступили в силу.
Глобальное перехват OkHttpClient или OkHttpClient.Builder
Чтобы глобально перехватить OkHttpClient или OkHttpClient.Builder, можно использовать методы BaseOkHttp.globalCustomOkHttpClient
и BaseOkHttp.globalCustomOkHttpClientBuilder
. Модифицированные компоненты также необходимо вернуть в параметры интерфейса.
1.0.1
Copyright Kongzue BaseOkHttp Licensed under the Apache License, Version 2.0 (the «License»); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
В данном проекте используется сетевая библиотека запросов square.okHttp3 (https://github.com/square/okhttp), которая распространяется на условиях лицензии Apache 2.0.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )