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

OSCHINA-MIRROR/dromara-forest

11.03.2025 04:14
GitLife Service Account

Изменения:

  • новая функциональность: #I1PZKA
  • исправление: #I1T0BY
  • исправление: #I1SYTW
  • исправление: #I1STJI
  • исправление: #I1STIP
Последнее сообщение коммита: test: headers
11.03.2025 04:14
GitLife Service Account

Версия v1.4.0 выпущена!

Извините за задержку выпуска версии 1.4.0 из-за большого количества новых функций.

Новые возможности по сравнению с версией 1.3.x:

  • Загрузка файла
  • Скачивание файла
  • Отслеживание прогресса при загрузке/скачивании файла
  • Расширенные пользовательские аннотации, привязка к перехватчику, создание метки для перехватчика
  • По умолчанию свойство dataType установлено как "auto", что позволяет автоматически распознавать тип возвращаемых данных и декодировать их
  • Механизм повторной попытки, реализация интерфейса Retryer для расширения стратегий повторной попытки, а также возможность указания через свойство retryer
  • Стратегия повторной попытки на основе алгоритма отложенного выполнения, которая является по умолчанию
  • Установка типа запроса на основе префикса имени метода
  • Добавлены аннотации @Get, @GetRequest, @Post, @PostRequest, @Delete, @DeleteRequest для упрощения описания конечных точек запросов
  • Добавлены аннотации @Query, @Body, @Header. В отличие от предыдущих аннотаций @DataParam, @DataObject, эти аннотации имеют более четкое назначение

Обновление относительно предварительной версии 1.4.0-RC4

Новые возможности:* новая функциональность: Добавлены методы addBody, replaceBody, getArguments в ForestRequest
  • новая функциональность: Загрузка файла без необходимости указания Content-Type

  • новая функциональность: Аннотация Header для параметров

  • новая функциональность: Возможность отправки BODY информации вместе с GET запросом (работает только с backend Httpclient)

  • новая функциональность: Добавлена аннотация userAgent##### Исправленные ошибки:

  • fix: Устранено отсутствие значения url в аннотации Request

  • fix: Отсутствие http:// в baseURL

  • fix: Автоматическое удаление / из baseUrl

  • fix: Ошибка сервера 500 при загрузке файла с backend HttpClient

  • fix: Отсутствие значений для свойств contentType, contentEncoding, userAgent

  • fix: Проблема приоритета между Content-Type и Content-Encoding

  • fix: Отсутствие зависимости spring-boot-starter

  • fix: Отсутствие значения Content-Encoding в заголовках ответа

  • fix: Проблема сериализации Map с помощью FastJSON

  • fix: Вывод содержимого BODY запроса GET в HttpClient

  • fix: Поддержка последовательности в FastJsonConverter

  • fix: Отсутствие действия заголовка Content-Type

  • fix: Отсутствие действия последовательности при преобразовании FastJson в Map

Изменения кода:* refactor: Классы MethodAnnotationLifeCycle и ParameterAnnotationLifeCycle перемещены в другой пакет
  • refactor: Удалён метод setArguments из ForestRequest

  • refactor: Переименовано поле type в target в классе MappingParameter

  • refactor: Удалено поле query из MappingParameter, заменено на type

  • refactor: Единая система сборки URL для Httpclient

  • refactor: Поле value в аннотациях Query, Body, Header больше не обязательно заполнять, могут применяться к объектным параметрам

  • refactor: Обёртка Entity для методов Get, Head, Options, Trace, Delete в Httpclient

  • Улучшение: Обёртка методов Get, Head, Options, Trace, Delete HTTP клиента в Entity

  • Улучшение: В запросе Query значение value не обязательно заполнять, можно использовать для модификации объектных параметров

  • Улучшение: Удалены аннотации BodyObject и HeaderObject

  • Улучшение: Все встроенные аннотации реализуются через расширенный способ

Последнее сообщение коммита: Merge branch 'dev' into gitee-master
Предпросмотр версии
11.03.2025 04:13
GitLife Service Account

Версия v1.4.0-RC4 выпущена, в которой добавлены аннотации @Get, @GetRequest, @Post, @PostRequest. Теперь нет необходимости указывать свойство type в аннотации @Request.

@Post(
    url = "http://localhost:${port}/hello",
    data = "username=foo&password=123456"
)
String sendPost1();

@PostRequest(
    url = "http://localhost:${port}/hello",
    data = "username=foo&password=123456"
)
String sendPost2();

Изменения:

  • feat: Добавлены аннотации запросов @Get, @GetRequest, @Post, @PostRequest
  • fix: По умолчанию Content-Encoding теперь пустая строка
  • fix: Ошибки при наличии ;charset= в заголовках ответа Content-Type
  • refactor: DataQuery переименован в Query, DataBody переименован в Body
Последнее сообщение коммита: refactor: rename AnnotationLifeCycle
Предпросмотр версии
11.03.2025 04:13
GitLife Service Account

версия v1.4.0-RC2 является промежуточной версией, следующая за ней будет уже стабильной. В этой версии были введены аннотации @DataQuery и @DataBody, позволяющие устанавливать тип запроса по префиксу имени метода, а также возможность получения заголовков из объекта ForestResponse.

Аннотация @DataQuery и @DataBody

@Request(
    url = "http://localhost:${port}/hello/user"
)
String send(@DataQuery("username") String username);

Аннотация @DataQuery используется для параметров, которые должны быть переданы как часть URL запроса.

@Request(
    url = "http://localhost:${port}/complex",
    type = "post",
    headers = {"Accept:text/plan"}
)
String send(@DataQuery("param") String param,
            @DataBody("username") String username,
            @DataBody("password") String password);

Аннотация @DataBody используется для параметров, которые будут отправлены в теле запроса. Исключение составляют методы типа GET или HEAD, которые не содержат тела запроса.

Префикс имени метода определяет тип запроса

@Request(
    url = "http://localhost:${port}/hello",
    data = "username=foo&password=123456"
)
String getHello(); // GET запрос


@Request(
    url = "http://localhost:${port}/hello",
    data = "username=foo&password=123456"
)
String postHello(); // POST запрос

@Request(
    url = "http://localhost:${port}/hello",
    data = "username=foo&password=123456"
)
String putHello(); // PUT запрос


@Request(
    url = "http://localhost:${port}/hello",
    data = "username=foo&password=123456"
)
String hello(); // Если ни один из префиксов не совпадает и тип запроса не указан, то это GET запрос

Новые возможности:feat: Установка типа запроса по префиксу имени метода

feat: По умолчанию имя файла для скачивания берется из URL
feat: Добавление аннотаций @DataQuery и @DataBody
feat: #I1QY77### Исправленные проблемы:

fix: Ошибка при возврате байтового массива после скачивания файла
fix: Переменная [method], которая может быть null или была проверена ранее, но её значение не гарантировано, что вызывает риск возникновения NullPointerException
fix: Переместите этот вызов wait() в блок синхронизации, чтобы убедиться, что монитор this был захвачен.

Изменения:

refactor: Удаление внутреннего класса SavingTrustManager, который не использовался
refactor: Замена заголовков запроса на класс ForestHeaderMap
add: Классы ForestHeader и ForestHeaderMap
add: Класс NameUtils для работы с именами
add: Инструмент для вывода прогресса загрузки файла

Последнее сообщение коммита: update: new version 1.4.0-RC2
Предпросмотр версии
11.03.2025 04:12
GitLife Service Account

Версия 1.4.0-RC1 выпущена с новыми возможностями отслеживания прогресса загрузки файлов и механизма повторной попытки.

Отслеживание прогресса загрузки

@Request(url = "http://forspeed.onlinedown.net/down/QQliveSetup_20_731.exe")
@DownloadFile(dir = "${dir}", filename = "${filename}")
File downloadFile(@DataVariable("dir") String dir, @DataVariable("filename") String filename, OnProgress onProgress);

При вызове используется lambda.

File file = downloadClient.downloadFile("D:\\TestDownload", "QQliveSetup_20_731.exe", progress -> {
    System.out.println("------------------------------------------");
    System.out.println("Общий размер байт: " + progress.getTotalBytes());   // Размер файла
    System.out.println("Текущий размер байт: " + progress.getCurrentBytes());   // Количество загруженных байтов
    System.out.println("Процент загрузки: " + Math.round(progress.getRate() * 100) + "%");  // Процент загрузки
    if (progress.isDone()) {   // Загрузка завершена?
        System.out.println("--------Загрузка завершена!--------");
    }
});
```#### Механизм повторной попытки:
Добавьте в конфигурационный файл следующее:
```yaml
forest:
  retry-count: 3                      # Количество повторных попыток при ошибке запроса
  max-retry-interval: 2000            # Максимальный интервал времени между повторными попытками, миллисекунды

Если вы хотите указать конкретные настройки повторной попытки для одного запроса, используйте аннотацию @Request:

@Request(
        url = "http://localhost:${port}/hello/user?username=foo",
        retryCount = 3,
        maxRetryInterval = 2000)
String testRetry();

По умолчанию используется стратегия повторной попытки с использованием алгоритма экспоненциального затухания. Это значит, что вместо того чтобы просто повторять запрос несколько раз, каждая последующая попытка будет осуществляться через увеличивающийся интервал времени, который равен степени двойки от номера попытки. Однако максимальный интервал времени не может превышать значение атрибута maxRetryInterval.#### Новые возможности:

  • feat: Отслеживание прогресса загрузки файлов
  • feat: Механизм повторной попытки, реализация которого происходит через интерфейс Retryer, а также можно указать его через свойство retryer
  • feat: По умолчанию используется стратегия повторной попытки с использованием алгоритма экспоненциального затухания
  • feat: Возможность использования пользовательского декодера, который можно указать через свойство decoder

Устранённые проблемы:

  • fix: Проблема с пустым значением типа контента ответа
  • fix: Проблема с отсутствием вызова метода OnMethodInvoke в интерцепторах
  • fix: Ошибка при сравнении объектов динамического прокси-класса клиента
  • fix: Проблема с недействительностью метода addAttribute в интерцепторах
  • fix: Проблема в методе addInterceptorAttribute класса Request
  • fix: Проблема с невозможностью возврата объекта File при использовании аннотации @DownloadFile

Другие изменения:

  • add: Класс ContentType
  • refactor: Выделение интерфейса ForestEncoder, переименование методов convertToJson и converterToXml в encodeToString
  • refactor: Использование статической переменной DEFAULT_CHARSET
  • refactor: Перемещение интерцептора аннотации @DownloadFile в пакет extensions
  • refactor: Перемещение класса BasicAuthInterceptor в пакет extension
  • refactor: Перемещение класса аннотации @BasicAuth в пакет extension
Последнее сообщение коммита: update: new version 1.4.0-RC1
11.03.2025 04:12
GitLife Service Account

Изменения:

  • Исправление: проблема неприспособленности разных версий OkHttp
  • Исправление: отсутствие методов toString и equals в динамически проксируемых классах для интерфейса Client
  • Исправление: ошибки преобразования данных при возврате типа Future
  • Исправление: сбой парсинга шаблонной строки при встрече символов \
Последнее сообщение коммита: update: new version 1.3.11
Предпросмотр версии
11.03.2025 04:11
GitLife Service Account

версия v1.4.0-BETA2 была выпущена; в этом выпуске были внесены значительные изменения, но основной акцент сделан на добавлении трёх новых функциональностей: загрузка файлов, пользовательские аннотации-интерцепторы и автоматическое распознавание типов данных.

Загрузка файлов:

/**
 * Используйте аннотацию @DownloadFile для загрузки файла, атрибут dir указывает целевой каталог, а filename — имя целевого файла
 */
@Request(url = "http://localhost:8080/images/test-img.jpg")
@DownloadFile(dir = "${targetDir}", filename = "new-img.jpg")
void downloadImage(@DataVariable("targetDir") String targetDir);
/**
 * Возвращаемый тип — это массив байтов, который позволяет преобразовать загруженный файл в массив байтов
 * @return
 */
@Request(url = "http://localhost:8080/images/test-img.jpg")
byte[] downloadImageToByteArray();
/**
 * Возвращаемый тип — это InputStream, который позволяет преобразовать загруженный файл в поток, и может использоваться вместе с аннотацией @DownloadFile
 * @return
 */
@Request(url = "http://localhost:8080/images/test-img.jpg")
@DownloadFile(dir = "D:\\TestDownload", filename = "temp.jpg")
InputStream downloadImageToInputStream();

Пользовательские аннотации:Новая версия позволяет расширять пользовательски определённые аннотации через интерцепторы, что довольно просто сделать:

  1. Создайте новый интерцептор, например, назовите его MyAuthInceptor.
  2. Создайте новую аннотацию и привяжите её к @InterceptorClass, указав нужный интерцептор.
@Documented
// Метка для интерцептора и указание класса BasicAuthInterceptor
@InterceptorClass(BasicAuthInterceptor.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAuth {
    /**
     * Имя пользователя для проверки.
     *
     * @return Имя пользователя.
     */
    String username();
}
```    /**
     * пароль для проверки
     * @return 
     */
    String password();
}
  1. Используйте ваш пользовательский интерцептор
    Привязывайте его к интерфейсу класса
@BaseRequest(baseURL = "http://localhost:${port}")
@MyAuth(username = "${username}", password = "bar")
public interface BaseAuthClient { ... }

или привязывайте его к методу

@Request(url = "http://localhost:${port}/hello/user?username=${username}")
@MyAuth(username = "${username}", password = "bar")
String send(@DataVariable("username") String username);

Forest в этой версии имеет встроенную базовую аннотацию авторизации @BasicAuth.

Автоматическое распознавание типов данных

Добавлен тип данных auto для dataType, который позволяет автоматически определять формат возвращаемых данных (JSON, XML или TEXT) и производить десериализацию.

@Request(
    url = "http://ditu.amap.com/service/regeo",
    dataType = "auto"   // Автоматическое определение типа данных JSON или XML
)
Map<String, Object> getLocation(@DataParam("longitude") String longitude, @DataParam("latitude") String latitude);

Теперь auto является значением по умолчанию для типа данных, поэтому вам больше не нужно беспокоиться о том, чтобы заполнять свойство dataType. Вы можете просто его пропустить.

// В случае отсутствия значения dataType, будет автоматически определён тип данных
@Request(url = "http://ditu.amap.com/service/regeo")
Map<String, Object> getLocation(@DataParam("longitude") String longitude, @DataParam("latitude") String latitude);

Конкретные новые возможности:* feat: Поддержка загрузки файлов

  • feat: Расширенные пользовательские аннотации с привязкой к интерцепторам, создающие метки для интерцепторов

  • feat: Возможность добавления прикрепленных файлов к объекту ForestRequest

  • feat: Обработка двоичных данных для преобразования массивов байтов и потоковых типов

  • feat: Базовая проверка

  • feat: По умолчанию значение dataType равно "auto", что позволяет автоматически распознавать тип возвращаемых данных#### Устранённые ошибки:

  • fix: Ошибочный парсинг при встрече символов \ в шаблонной строке

  • fix: Проблемы совместимости различных версий OkHttp3

  • fix: Ошибки конвертации данных при использовании Future в OkHttp backend

Изменения в коде:

  • add: Автоматический конвертер типа данных auto
  • add: Атрибуты filename, contentType, contentEncoding, contentLength в классе ForestResponse
  • add: Аннотация и интерцептор для базовой проверки
  • add: Аннотация и интерцептор для загрузки файлов
  • add: Аннотация для определения меток интерцепторов
  • add: Класс атрибутов интерцептора InterceptorAttributes
  • add: Метод жизненного цикла handleInvokeMethod
  • add: Default методы интерфейса Interceptor: beforeExecute, afterExecute, addAttribute, getAttributes, getAttributeAsString, getAttributeAsInteger, getAttributeAsFloat, getAttributeAsDouble
  • add: Инструментальный класс Base64
  • add: Интерцептор для загрузки файлов @DownloadFile
  • add: Новый тип данных auto, binary
  • refactor: Обработка результатов запросов на скачивание двоичных данных
  • refactor: Получение содержимого ответа перемещено в подклассах ForestResponse
  • update: Обновление версии okhttp
  • refactor: Переименование класса ReflectUtil в ReflectUtils
  • refactor: Обработка текстовых данных через специализированный конвертер
  • refactor: Добавление параметра источника в ForestConverter* обновление: регистрация текстовых конвертировщиков, бинарных конвертировщиков и автоматических типовых конвертировщиков в ForestConfiguration
Последнее сообщение коммита: test: @BasicAuth注解拦截器
Предпросмотр версии
11.03.2025 04:10
GitLife Service Account

v1.4.0-BETA1 является бета-версией, в которой реализовано основное свойство — загрузка файлов. Возможность загрузки файлов будет доступна в последующих версиях.

Пример использования загрузки файла:

@Request(
    url = "/upload",
    type = "POST",
    dataType = "JSON",
    contentType = "multipart/form-data"
)
Map upload(@DataFile("file") File file, OnProgress onProgress);

Ключевые моменты:

  1. Используйте аннотацию @DataFile для параметров, которые требуется загрузить. Поддерживаемые типы данных включают File, String, InputStream, byte[], MultipartFile, Resource.

  2. Обязательным атрибутом аннотации @DataFile является value, которое представляет собой имя параметра запроса для объекта файла.

  3. Атрибут fileName аннотации @DataFile представляет имя файла. Для типов данных File, String, MultipartFile, Resource это необязательное поле, а для InputStream и byte[] — обязательное.

  4. Параметр OnProgress используется для отслеживания прогресса загрузки.

Новые возможности:* feat: Загрузка файлов

  • feat: Отслеживание прогресса загрузки файлов

  • feat: Добавлена аннотация @DataFile для модификации параметров загрузки файлов, поддерживаются типы данных File, String, InputStream, byte[], MultipartFile, Resource

  • feat: Добавлен метод обратного вызова OnProgress для отслеживания прогресса загрузки

  • feat: Добавлен объект параметра ForestProgress для метода обратного вызова OnProgress

  • feat: В аннотации @Request добавлен атрибут progressStep, который описывает количество байтов, после которых происходит отслеживание прогресса

  • feat: В интерфейсе Interceptor добавлен метод OnProgress (не обязательно реализуется в реализующем классе)#### Изменения:

  • refactor: Класс ResponseHandler переименован в LifeCycleHandler

  • refactor: Обновлено до версии HttpClient 4.5.2

  • refactor: Добавлен класс ForestMultipart, который использует типы данных для загрузки файлов

Последнее сообщение коммита: update: new version 1.4.0-BETA1
11.03.2025 04:10
GitLife Service Account

Изменения:

  • fix: #I1PSPC
  • fix: #I1PIWM
  • fix: #I1PSFQ
  • add: метод ForestRequest.addQuery
  • add: перечисление com.dtflys.forest.http.ForestRequestType
  • refactor: свойство query в ForestRequest из строки заменено на Map
  • refactor: свойство type в ForestRequest из строки заменено на перечисление
Последнее сообщение коммита: update: new version 1.3.10
11.03.2025 04:10
GitLife Service Account

Исправлено:

  • fix: решено #I1PQCP
Последнее сообщение коммита: update: new version 1.3.8
11.03.2025 04:10
GitLife Service Account

Исправлено:

  • fix: исправление ошибки при использовании аннотации @DataObject для параметра типа List
  • fix: исключение не должно выбрасываться при использовании ForestResponse в качестве типа возвращаемого значения
  • fix: метод getResult возвращает неверные данные
Последнее сообщение коммита: doc: 更新为1.3.7版本
11.03.2025 04:10
GitLife Service Account

Измененные части:

Последнее сообщение коммита: Merge branch '1.3.x' into gitee-master
11.03.2025 04:10
GitLife Service Account

Основные изменения:

  • feat: Поддержка Spring Boot 1.5.x
  • refactor: Устранение повторной загрузки бинов в Spring
Последнее сообщение коммита: Merge branch '1.3.x' into gitee-master
11.03.2025 04:10
GitLife Service Account

Исправленные ошибки:

  • fix: OnSuccess callback функция принимает данные с типами параметров generics для парсинга в JSON с ошибками
Последнее сообщение коммита: doc: 回调函数
11.03.2025 04:10
GitLife Service Account

Исправленные ошибки:

  • Исправлена проблема с разной последовательностью инициализации при разных версиях spring boot
  • По умолчанию используется бэкенд okhttp3
  • Исправлена проблема с недействительным количеством попыток повторной отправки для бэкенда okhttp3
Последнее сообщение коммита: doc:介绍的版本为 1.3.0
11.03.2025 04:09
GitLife Service Account

Новые возможности в версии v1.3.0:

  • Добавлены новые свойства в @BaseRequest: baseURL, contentType, contentEncoding, timeout, interceptor.
  • Использование @BaseURL больше не рекомендовано.
  • Удалён глобальный переключатель forest.enabled.
  • Включена возможность конфигурирования глобального интерцептора.
  • Добавлена запись логов информации запроса/ответа, включающая состояние ответа, время выполнения запроса и т.д.

Исправленные ошибки:

  • Устранено отсутствие зависимости commons-lang3.
  • Реализована проверка двойной блокировки при получении интерцептора.
  • Исправлены орфографические ошибки в названиях некоторых классов.
  • Устранена проблема с недействительностью заголовков ContentType запроса.
  • Исправлены конфликты версий Jackson.
Последнее сообщение коммита: doc: HTTPS
11.03.2025 04:09
GitLife Service Account

Изменения:

  1. Добавлена поддержка Spring Boot Starter
  2. Добавлены и реализованы свойства аннотации @BaseRequest
  3. Исправлены ошибки
Последнее сообщение коммита: 添加微信群QR Code
30.11.2024 02:00
GitLife Service Account

fix: #I1VJ19

Последнее сообщение коммита: update: new version 1.4.10
1
https://api.gitlife.ru/oschina-mirror/dromara-forest.git
git@api.gitlife.ru:oschina-mirror/dromara-forest.git
oschina-mirror
dromara-forest
dromara-forest