изначально взят с https://github.com/hongyangAndroid/okhttputils
Классы для работы с okhttp, okhttp доступен по адресу: https://github.com/square/okhttp.
Совместим с версией okhttp 3.14.9
.
dependencies {
implementation 'io.openharmony.tpc.thirdlib:okhttputils:1.0.1'
}
По умолчанию будет использоваться конфигурация OkHttpClient по умолчанию. Если вы хотите использовать какую-либо другую конфигурацию, используйте метод initClient
в AbilityPackage.
public class MyHapPackage extends AbilityPackage {
@Override
public void onInitialize() {
super.onInitialize();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
// .addInterceptor(new LoggerInterceptor("TAG"))
.connectTimeout(10000L, TimeUnit.MILLISECONDS)
.readTimeout(10000L, TimeUnit.MILLISECONDS)
// Другие настройки
.build();
OkHttpUtils.initClient(okHttpClient);
}
}
Не забудьте указать это в config.json.## Для работы с cookies (включая сессии)
Для работы с cookies также можно воспользоваться методом cookiejar. Процесс настройки аналогичен приведённому выше примеру.
CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
// Другие настройки
.build();
OkHttpUtils.initClient(okHttpClient);
Проект включает:
Если возникнут проблемы, обратитесь за помощью, а также можете реализовать интерфейс CookieJar и написать свой код управления cookies.
Кроме того, для сохранения cookies можно использовать https://github.com/franmontiel/PersistentCookieJar. Эквивалентно тому, что в рамках предоставляются несколько реализованных классов, и вы можете самостоятельно настроить или выбрать использовать.
При инициализации OkHttpClient это достигается путём установки interceptors, в рамках которого предоставлен LoggerInterceptor
. Конечно, вы также можете создать свой собственный interceptor.
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new LoggerInterceptor("TAG"))
// Другие конфигурации
.build();
OkHttpUtils.initClient(okHttpClient);
Опять же, это достигается через конфигурацию, где в рамках предоставлена библиотека HttpsUtils
.* Установка доступа ко всем HTTPS сайтам:
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
// Другие конфигурации
.build();
OkHttpUtils.initClient(okHttpClient);
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(сертификатInputStream, null, null);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
// Другие конфигурации
.build();
OkHttpUtils.initClient(okHttpClient);
HttpsUtils.getSslSocketFactory(
сертификатInputStream,
локальныйСертификатInputStream,
парольЛокальногоСертификата);
Аналогично, в рамках проекта предоставляются несколько реализованных классов, и вы можете самостоятельно реализовать SSLSocketFactory
, передав его как sslSocketFactory.
String url = "http://www.csdn.net/";
OkHttpUtils
.get()
.url(url)
.addParams("username", "hyman")
.addParams("password", "123")
.build()
.execute(new StringCallback() {
@Override
public void onError(Request request, Exception e) {
}
@Override
public void onResponse(String response) {
}
});
OkHttpUtils
.post()
.url(url)
.addParams("username", "hyman")
.addParams("password", "123")
.build()
.execute(callback);
OkHttpUtils
.postString()
.url(url)
.content(jsonContent)
.mediaType(MediaType.parse("application/json; charset=utf-8"))
.build()
.execute(callback);
``````java
OkHttpUtils
.postString()
.url(url)
.content(new Gson().toJson(new User("zhy", "123")))
.mediaType(MediaType.parse("application/json; charset=utf-8"))
.build()
.execute(new MyStringCallback());
При отправке строки Gson на сервер обратите внимание: при передаче JSON не используйте addHeader для установки contentType, а вместо этого воспользуйтесь .mediaType(MediaType.parse("application/json; charset=utf-8"))
.### Отправка файла
OkHttpUtils
.postFile()
.url(url)
.file(file)
.build()
.execute(new MyStringCallback());
Отправляет файл в теле запроса на сервер.
OkHttpUtils.post()//
.addFile("mFile", "messenger_01.png", file)//
.addFile("mFile", "test1.txt", file2)//
.url(url)
.params(params)//
.headers(headers)//
.build()//
.execute(new MyStringCallback());
Поддерживает одновременную отправку одного или нескольких файлов. Первый параметр метода addFile
представляет собой ключ файла, то есть значение атрибута name
в форме <input type="file" name="mFile"/>
.
Внутренне поддерживаются StringCallback
, FileCallback
, BitmapCallback
. Вы можете создать свой собственный CallBack в зависимости от ваших потребностей, например, чтобы вернуть объект User
:
public abstract class UserCallback extends Callback<User> {
@Override
public User parseNetworkResponse(Response response) throws IOException {
String string = response.body().string();
User user = new Gson().fromJson(string, User.class);
return user;
}
}
OkHttpUtils
.get()//
.url(url)//
.addParams("username", "hyman")//
.addParams("password", "123")//
.build()//
.execute(new UserCallback() {
@Override
public void onError(Request request, Exception e) {
mTv.setText("onError:" + e.getMessage());
}
@Override
public void onResponse(User response) {
mTv.setText("onResponse:" + response.username);
}
});
Метод parseNetworkResponse
используется для парсинга ответа сети, этот метод выполняется в фоновом потоке, поэтому вы можете выполнять любые затратные операции, подробнее см. примеры.### Загрузка файла
OkHttpUtils//
.get()//
.url(url)//
.build()//
.execute(new FileCallback(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")//
{
@Override
public void inProgress(float progress)
{
mProgressBar.setProgress((int) (100 * progress));
}
@Override
public void onError(Request request, Exception e)
{
Log.e(TAG, "ошибка:" + e.getMessage());
}
@Override
public void onResponse(File file)
{
Log.e(TAG, "ответ:" + file.getAbsolutePath());
}
});
При загрузке файла можно использовать FileCallback
, передав путь к директории и имя файла.
OkHttpUtils
.get()//
.url(url)//
.build()//
.execute(new BitmapCallback()
{
@Override
public void onError(Request request, Exception e)
{
mTv.setText("Ошибка: " + e.getMessage());
}
@Override
public void onResponse(Bitmap bitmap)
{
mImageView.setImageBitmap(bitmap);
}
});
Для отображения изображения достаточно передать BitmapCallback
.
new Callback<T>()
{
//...
@Override
public void inProgress(float progress)
{
//используйте прогресс: 0 ~ 1
}
}
В коллбэке есть метод inProgress
, который можно переопределить для отслеживания прогресса.
OkHttpUtils
.put()//также можно использовать delete(), head(), patch()
.requestBody(RequestBody.create(null, "может что-то"))//
.build()//
.execute(new MyStringCallback());
Если требуется передача данных в теле запроса, как в случае с PUT или PATCH, создайте объект RequestBody
и передайте его.### Синхронные запросы
Response response = OkHttpUtils
.get()//
.url(url)//
.tag(this)//
.build()//
.execute();
Метод execute()
без передачи коллбэка выполняет синхронный запрос и возвращает объект Response
.
RequestCall call = OkHttpUtils.get().url(url).build();
call.cancel();
Для всех поддерживаемых методов последний параметр — это Object tag
. Для отмены используется метод OkHttpUtils.cancelTag(tag)
.
Например, при работе с AbilitySlice, когда AbilitySlice уничтожается, все связанные запросы также могут быть отменены:
OkHttpUtils
.get()//
.url(url)//
.tag(this)//
.build()//
@Override
protected void onStop()
{
super.onStop();
// можно отменить все запросы с одним тегом
OkHttpUtils.cancelTag(this); // отменяет все запросы с тегом AbilitySlice.this
}
#okhttputils
-dontwarn com.zhy.http.**
-keep class com.zhy.http.** {*;}
#okhttp
-dontwarn okhttp3.**
-keep class okhttp3.** {*;}
#okio
-dontwarn okio.**
-keep class okio.** {*;}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )