更新记录
v1.7.1
- feat: 字符串模板支持空安全语法
 - feat: 更友好的字符串模板错误消息
 - feat: 字符串模板
{、${等符号支持转义\\{、\\${ - feat: 字符串模板支持深度变量引用
 - feat: 字符串模板支持停止深度引用的语法
 - feat: 支持嵌套字符串模板
 - feat: 新增更安全的 Forest 拦截器接口 ForestInterceptor
 - feat: 通过配置自定义异步线程池拒绝策略
 - feat: 支持 Bear 认证器
 - feat: 支持
@Var作为方法和类的变量绑定注解 - feat: 新增 ForestRequest 级别的日志开关接口
 - feat: 增强 Cookie 相关 API 接口
 - feat: 后台自动清理过期 Cookie
 - feat: 支持 Cookie 自动化存取机制
 - fix: 和老版本 Forest 冲突时,新版本Forest类缺乏
get(url)、post(url)等方法签名,造成错误 (#IC7LIH (opens new window)) - fix: body log在部分环境中文乱码
 - fix: 修改接口中常量的命名,避免用户在其与只有大小写区别的方法之间产生混淆
 - refactor: 重构URL解析过程
 - refactor: 重构变量作用域
 - refactor: 重构 Forest 变量体系
 - refactor: ForestCookie 不再依赖 OkHttp
 - refactor: 
ForestCookie.parse()接口 - refactor: 添加键值对类型请求体删除接口
ForestBody.removeNameValueBody - optimize: 优化请求性能
 - optimize: 根据 Response 类型动态判断响应是否自动关闭
 - optimize: 默认后端改为 httpclient
 - optimize: 拦截器优化
 
v1.6.4
- feat: 添加根据类型获取body对象的接口,可通过
request.body().get(Class)获得body中对应类型的对象 - feat: 支持指定 SSE 消息行模式,包括单行、多行、以及自动模式
 - fix: 由Content-Type中
; charest=utf8部分包含空格导致的body无故乱码的问题 - fix: 和老版本forest冲突时,新版本Forest类缺乏get(url)、post(url)等方法签名,造成错误
 
v1.6.3
- add: 
EventSource.value(Class<T>)方法 - add: 
EventSource.value(TypeReference<T>)方法 - refactor: 
SSEInterceptor.onSSEClose(ForestRequest, ForestResponse)方法参数改为SSEInterceptor.onSSEClose(EventSource) - refactor: 
ForestSSE.setOnClose(BiConsumer<ForestRequest, ForestResponse>)方法参数改为ForestSSE.setOnClose(Consumer<EventSource>) - refactor: 
EventSource.getValue()方法重命名为EventSource.value() - refactor: 
EventSource.getName()方法重命名为EventSource.name() - refactor: 
EventSource.getRawData()方法重命名为EventSource.rawData() - update: 更新依赖版本
 
v1.6.2
- feat: 新增
ForestSSE.close()监听关闭接口 - feat: 新增
ForestSSE.await()用于阻塞等待异步监听完成 - fix: 
EventSource.close()无法正常关闭 SSE 监听 - fix: 通过JsonPath获取基本类型字段错误
 
v1.6.1
- feat: SSE 拦截器
 - fix: @SSEName 注解参数取值错误
 - fix: SSE 请求长连接超时
 - fix: SSE 请求返回的控制器为单例的问题
 - update: SSE 适配 spring-boot 和 solon
 
v1.6.0
- feat: 支持SSE
 - feat: 链式条件接口
 - feat: 支持Jsonpath
 - feat: 字符串模板可以用
{}替代{数字}作为参数占位符 - feat: 类级别
@BindingVar注解 - feat: 适配Android环境的Log
 - feat: 新增 onResponse 生命周期回调函数
 - feat: 支持 Optional 作为接口返回结果类型
 - feat: 支持 CompletableFuture 作为接口返回结果类型
 - feat: 自定义 LogHandler 支持 Spring Bean 方式注入
 - feat: 美化字符串表达式报错信息
 - feat: 新增安全响应流处理接口
 - fix: 百分号无法被 URLEncode 的问题
 - fix: @Address 注解的属性无法重写的问题
 - fix: 过滤器函数无法调用
 - fix: 可能出现的 connection pool shut down 问题
 - fix: 在后端为okhttp3情况下,打印
content-type为multiparty/form-data,body为其他类型时报错的问题 - fix: 在拦截器的onMethodInitialized方法中调用setReturnType函数无效(#I8PJ9R)
 - fix: 修复未恢复parentScope导致的栈溢出(#I9TP9Z)
 - update: 缓存框架换成Hutool的LRU缓存
 - update: forest-solon-plugin 升级 solon 为:3.0.1(兼容 2.5.9+)
 - update: 更新依赖最新稳定版本
 - refactor: 在发生 Response: 
[Network Error]错误时,可以打印 status 信息 - opt: query支持线程安全
 - reflector: 重构 ForestAuthenticator 接口
 - refactor: 重构响应的流处理逻辑
 - add: ResultGetter.openStream 方法
 - refactor: 修改表达式异常报错信息格式
 
v1.5.36
- feat: 支持 Fastjson2
 - fix: okhttp 后端
response.getContentLength()取不到值 (#I90MUX (opens new window)) - fix: Jackson转换器中Lazy转换Map出错
 - Update: solon 升级为
v2.6.5 - refactor: 不在生成 multipart boundary 字符串时使用 okio 包的方法
 
v1.5.35
- feat: 后端客户端实例缓存可配置大小以及过期时间
 
v1.5.34
- fix: 当请求不同的域名很多时,内存消耗越来越大 (#I8J5PN (opens new window))
 - fix: 高并发环境下,监控runningPoolSize值,出现负值情况&且有时候所有请求都结束了,但值没有归零 (#I8JNBU (opens new window))
 - fix:完善单元测试之修复声明式接口,
@BaseRequest或@BaseURL,在有baseURL属性下,如果方法的完整URL不写端口,就会被baseURL属性的端口覆盖,并不是默认的80端口的bug - fix: 修复不管是是用
@Address还是@BaseRequest都无法将baseUrl和@Get()中的url拼接在一起的bug (#I7CAYS (opens new window)) - fix: 处理
@addrees注解中basePath已/结尾,方法url不以/开头,最终地址会出现//的bug。 - fix: MultipartRequestBody 类冲突 (154 (opens new window))
 - refactor: 将gson改为单例
 - refactor: 去掉
@DownloadFile注解在下载文件时的进度日志 - refactor: 将 forest-spring-boot3 的相关测试用例移动到 forest-test 下
 
v1.5.33
- feat: 支持socks代理 (#I6MLMD (opens new window))
 - feat: 组合注解支持属性重写
 - fix: 
@Body注解的数组参数无法正常解析为JSON数组 (#I7UPBR (opens new window)) - fix: Content-Type为
application/xml的情况下,发送byte数组数据错误 (#I7F3F0 (opens new window)) - fix: 
@JSONBody Collection<String> codes报错 (#I7QLTS (opens new window)) - add: 
@SocksProxy注解 - add: 
@OverrideAttribute注解 - opt: 优化URL更新方式
 - update: forest-solon-plugin 升级 solon 为
2.4.0 
v1.5.32
- fix: 在
@Header参数中传入 Lazy Lambda 出错 (#I7EIAB (opens new window)) - fix: URLEncoder 无法编码百分号字符 (134 (opens new window))
 - opt: 异步线程池初始化时并发优化
 
v1.5.31
- feat: 所有 Forest 请求默认带上
User-Agent: forest/{version}的请求头 - fix: maven中各模块的JDK版本控制
 - fix: 不同 ForestConfiguration 产生的 Client 实例存在参数污染的情况
 - fix: 当
@Address注解的 schema 属性设置为 https 时报错 (#I6Y6E2 (opens new window)) - fix: ReflectUtils.getFields非线程安全 (#I6W9TF (opens new window))
 - opt: ForestMethod 使用懒加载的方式初始化
 - refactor: 使用 revision 进行多模块版本管理
 - refactor: 请求注解的 interceptor 属性只接受继承自 Interceptor 接口的类
 - add: 
Forest.VERSION字段,可动态获取 Forest 版本号 
v1.5.30
- feat: 适配 springboot3
 - feat: 适配 solon
 - feat: 延迟参数 (Lambda参数),支持 Query, Header,Body 三种参数的延迟求值
 - feat: 可自定义异步请求池拒绝策略
 - feat: 请求体序列化接口,ForestRequest.body().encode() 和 ForestRequest.body().encodeToString()
 - fix: ForestProxy添加header没有效果 ForestProxy添加header没有效果 (#I63WWN (opens new window))
 - fix: onBodyEncode 生命周期顺序问题
 - fix: 不同 ForestConfiguration 对象共用同一个异步线程池的问题
 - fix: 无法解析 localhost:8080 这类省略 http:// 的 url
 - reflector: 将xml解析模块拆分成了 forest-jaxb 和 forest-jakarta-xml 两个子模块,需要的情况要分别自行引入
 - reflector: request body encoder
 - refactor: Forest Body clone
 - refactor: 构建 Query String 部分
 - add: HTTPRoxy 注解的 headers 属性
 - add: forest 示例工程
 
v1.5.28
- feat: 拦截器新增 onBodyEncode 回调函数 (#I4WF5Q (opens new window))
 - feat: 隐式转换带 BasicAuth 认证信息的请求 (#I62BTW (opens new window))
 - feat: 声明式接口可返回
ForestFuture<T>类型 - fix: 下载文件,从URL中取得文件名时前后双引号的问题 (#I61NPK (opens new window))
 - fix: 参数为空,导致空指针问题 (#110 (opens new window))
 - fix: @HttpClient 和 @okhttp 注解在 1.5.27 失效的问题
 - fix: SpringSSLKeyStore构造方法缺少参数导致SpringBoot项目启动失败
 - fix: Null Pointer Error 当指定RetryWhen (#I5WEBC (opens new window))
 - fix: @BaseRequest里的 connectTimeout和readTimeout没效果 (#I5WC6U (opens new window))
 - fix: 接口上@Address注解的basePath设置为完整URL时,request.basePath() 结果不正确
 
v1.5.27
- feat: 异步API增强, 支持 Async/Await 风格 (#I60IAL (opens new window))
 - feat: 响应API增强, 后验数据转换 (#I60IDO (opens new window))
 - feat: kotlin协程
 - feat: 请求可中断取消执行 (#I60I90 (opens new window))
 - fix: ForestHeaderMap.addCookie时可能会存在无法进入header的问题 (#100 (opens new window))
 - fix: 发送 multipart/form-data 请求时,@Body参数为空会报错 (#I5Y7WJ (opens new window))
 - fix: 未设置 charset 时,调用 ForestRequest.getQueryString() 报错 (#I5RGX4 (opens new window))
 - fix: ForestRequest.getBasePath() 无法获取 AddressSource 中定义的 basePath (#I5RGOY (opens new window))
 - fix: x-www-form-urlencoded 格式请求 Body 在 URLEncode 时忽略 #
 - fix: 在重试的时候没有关闭上一次的请求响应
 
v1.5.26
- feat: 在使用 OkHttp3 后端情况下,允许Query参数不转义大括号 (#I5ITW9 (opens new window))
 - feat: 在使用 OkHttp3 时绕过空 Multipart 错误 (#I5I1AC (opens new window))
 - fix: 默认自动绕过SSL验证
 - fix: 声明的接口返回类型如果是String(或其他Charsequencel类型)导致自定义converter (#I5L2P6 (opens new window))
 - fix: okhttp后端自动将charset=UTF-8转成了小写 (#I5L4AS (opens new window))
 - fix: url域名信息参数赋值会自动参数后添加”/“符号路径导致错误 (#I5I62P (opens new window))
 - fix: URL路径中的$字符会被转义
 - fix: 请求的ForestURL的ssl属性没有继承类里@BaseRequest的ssl信息 (#I5HXHX (opens new window))
 - update: 更新 spring 版本到
5.3.19 - update: 更新  spring boot 版本到
2.6.7 
v1.5.25
- fix: 匹配验证secure cookie
 - fix: cookie携带请求不成功 (#I5F8IY (opens new window))
 - fix: OKHTTP 连接泄漏问题 (#I5E613 (opens new window))
 - fix: forest 支持springboot 1.5.14.realese 启动失败 (#I5FDBG (opens new window))
 - fix: 传的参数带有+号,但是服务接收时,获取的参数值中+号全部变成空格了 (#I5EG9L (opens new window))
 - add: OkHttp3Cookie
 - add: HttpclientCookie
 - update: 更新jackson版本到2.13.3
 - update: 更新jackson-databind版本到2.13.3
 - update: 更新jackson-annotations版本到2.13.3
 - update: 更新gson版本到2.8.9
 - update: 更新fastjson版本到1.2.83
 
v1.5.24
- fix: OKHTTP 连接泄漏问题 (#I5E613 (opens new window))
 - fix: 遇到无法解析的Cookie时会报空指针 (#I5E27R (opens new window))
 
v1.5.23
- feat: 快速接口支持快速下载文件
 - feat: 可配置注入OkHttpClient和HttpClient对象 (#I5CWAL (opens new window))
 - feat: 可配置接口的后端Client对象是否缓存 (#I5D818 (opens new window))
 - fix: springboot配置binary转换器初始化失败 (#I5D07S (opens new window))
 - fix: ForestResponse.statusIs(xxx)会出现空指针 (#I5CWQL (opens new window))
 - fix: 在@Address注解的basePath中写的端口号会失效 (#I5CR15 (opens new window))
 - fix: 使用@HTTPProxy注解对https请求设置http代理后出现java.lang.IllegalArgumentException:Socket may not be null
 - fix: 在不设置ContentType和BodyType的情况下无法正常发送请求 (#I5CML4 (opens new window))
 - fix: ForestRequest.addBody(List) 循环中只执行一次
 - refactor: 重构Cookie (#I5C26U (opens new window))
 - refactor: 重构OkHttpClient
 - add: 添加拦截器到请求中方法ForestRequest#addInterceptor(Class<? extends Interceptor>)
 - add: HttpClientFactory
 - add: OkHttpClientFactory
 
v1.5.22
- feat: 统一连接池 (#I5APJA (opens new window))
 - feat: 可配置异步请求线程池队列大小 (#I5B78X (opens new window))
 - feat: 支持通过参数定义返回类型 (#I5ANZL (opens new window))
 - fix: spring 5.1 以下的低版本启动失败
 - fix: 请求地址中包含#字符会被转义导致资源找不到 (#I59O7M (opens new window))
 - fix: 配置BaseRequest的baseURL属性后,完整请求路径中的默认端口号会被覆盖,导致请求失败 (#I4YBDV (opens new window))
 - fix: 解决当@body注解在对象上标识以后,char&Character类型的属性无法从客户端传输至服务端问题
 - fix: kotlin项目启动异常 (#I50PDZ (opens new window))
 - fix: RetryWhen重试条件接口在最后一次重试后会执行两次 (#I599BT (opens new window))
 - update: #I5ANZR 删除单元测试代码中的Log4j2依赖
 
v1.5.21
- feat: 字符串模板支持手动URLEncode (#I58D1C (opens new window))
 - fix: url在某些场景下的解析错误 (#I56XDM (opens new window))
 
v1.5.20
- feat: 支持JDK17,兼容从8、11到17所有JDK版本
 - fix: BaseRequest 设置connectTimeout和readTimeout没效果 (#I4Z8Y0 (opens new window))
 - fix: 下载,内存溢出 (#I4NFPE (opens new window))
 - fix: AddressSource 里面配置 basePath 不生效 (#I50LVA (opens new window))
 
v1.5.19
- fix: 在原生Spring环境中,拦截器无法注入Spring上下文 (#I4UE9T (opens new window))
 - fix: httpclient后端的https连接池并发时数据会串 (#I4TYJ1 (opens new window))
 - fix: 响应头两个 Set-Cookie 的时候只能取到最后一个 (#I4TATV (opens new window))
 - refactor: 去掉 commons-logging 包的依赖
 
v1.5.17
- feat: 动态正向代理来源信息 (#I4SYM1 (opens new window))
 - fix: 异常:The file of SSL KeyStore is empty (#I4SYGB (opens new window))
 - fix: maxRetryInterval配置失效 (#I4SV2P (opens new window))
 - fix: 主项目没有依赖lang3会报错的问题 (#I4M9DE (opens new window))
 - fix: 组合注解未生效 (#I4N2HC (opens new window))
 - refactor: 去掉 NameUtils 工具类中重复的if分支
 
v1.5.16
- feat: 自定义 hostnameVerifier 和 SSLSocketFactoryBuilder (#I4LGW8 (opens new window))
 - feat: 根据Response的Content-Encoding自动识别是否为gzip压缩数据,并自动解压
 - fix: 重定向后URL的Query参数会重复增加 (#I4LPGU (opens new window))
 - fix: 修复content-encoding导致的字符编码转换异常 (#I4LJ3X (opens new window))
 - fix: 修复字符编码判断的BUG
 - add: @SSLHostnameVerifier 注解
 - add: @SSLSocketFactoryBuilder 注解
 
v1.5.14
- feat: 支持设置异步请求的线程池大小 (#I4JXN3 (opens new window))
 - feat: ForestBody对象添加获取所有键值对的方法(包括对象Body项) (#I4JDRR (opens new window))
 - fix: URL中包含@,会去掉@ (#I4J3LU (opens new window))
 - add: AsyncAbortPolicy类
 - add: ForestBody.nameValuesMapWithObject
 
v1.5.13
- feat: 指定请求体类型的@BodyType注解 (#I4IF3N (opens new window))
 - feat: 新增获取全部请求体中键值对参数的方法 (#I4GWO7 (opens new window))
 - fix: 在请求中设置自定义Encoder无效 (#I4HNZF (opens new window))
 - fix: url解析问题,如果包含@符@会去掉 (#I4GQWW (opens new window))
 - add: BodyType注解
 - add: FastjsonEncoder注解
 - add: GsonEncoder注解
 - add: JacksonEncoder注解
 - delete: com.dtflys.forest.http.ForestBodyType类
 - update: 
ForestRequest类的setBodyType方法和bodyType方法的参数类型改为ForestDataType 
v1.5.12
- feat: getbody可以有key-value形式进行取值 (#I4FUSB (opens new window))
 - fix: URL参数会重复Encode (#I4FDJC (opens new window))
 - fix: {变量名}格式字符串模板在引用隐式变量时出错 (#I4EP04 (opens new window))
 - fix: 对于http://localhost/xxx:yyy这种形式的URL解析错误 (#I4GC5M (opens new window))
 - fix: httpclient和okhttp编码行为不一致 (#I4FRR5 (opens new window))
 - fix: post请求的url为空的时候有bug (#I4F3XS (opens new window))
 - fix: retrywhen中的异常被吃掉, 无法抛出. 且异常后仅触发一次重试 (#I4E4X7 (opens new window))
 - fix: Httpclient后端在连续异步发送请求后会出现I/IO报错 (#I47FD7 (opens new window))
 - optimize: Forest对于一些错误的响应处理不友好 (#I4EIDJ (opens new window))
 - refactor: 重构后端代码: 表单类型Body部分
 - refactor: 重构后端: okhttp3
 - refactor: 重构后端: httpclient
 - refactor: 重构后端: 重写异步请求逻辑
 - add: ForestBody类
 - add: Validations类
 - delete: OkHttp3不再使用的请求执行器类
 
v1.5.11
- fix: connect-timeout配置在springboot 1.x 版本下无法解析 (#I4ECR3 (opens new window))
 - optimize: 增强字符串模板报错信息 (#I4EC9V (opens new window))
 
v1.5.10
- fix: 重新URL解析后,引起的空指针问题
 
v1.5.9
- fix: URI路径的URLEncoder编码结果不正确 (#I4DUFG (opens new window))
 
v1.5.8
- fix: 使用
@DownloadFile下载文件时,在某些环境下会发送阻塞 (#I4DLBI (opens new window)) 
v1.5.7
- fix: response对google protobuf包依赖 (#I4DKQW (opens new window))
 
v1.5.6
- feat: 将timeout细化为connectTimeout和readTimeout (#I4DH21 (opens new window))
 - fix: Google Protobuf包依赖错误 (#I4DDZY (opens new window))
 - fix: 配置forest.connect-timeout不生效 (#I45298 (opens new window))
 
v1.5.5
- feat: 支持每个请求都可自定义序列化转换器 (#I4CLV8 (opens new window))
 - feat: 二进制类型请求体 (#I4D4GY (opens new window))
 - feat: Protobuf请求体 (#I4D4JT (opens new window))
 - feat: 转换器对应包依赖 需要时获取 (#I29XE0 (opens new window))
 - fix: getAttribute方法在多线程情况下取值会串 (#I4D5KS (opens new window))
 - fix: 在onRetry方法中,调用 addQuery 或 addBody 能API无效 (#I4CZS5 (opens new window))
 - add: 
@OkHttp3注解 - add: 
@HttpClient注解 - add: ForestRequest.type(ForestRequestType type) 方法
 - add: ForestLogHandler.logContent(String content) 方法
 
v1.5.4
- fix: 依赖Guava包 (#I4CC9B (opens new window))
 - fix: 
@Query注解修饰Map参数时,Map中的列表属性无法正常序列化 (#I4C8UC (opens new window)) - fix: 多线程下的并发问题
 - update: 去掉多余的DEBUG日志
 - add: ForestLogHandler.logContent(String content) 方法
 - add: ForestRequest.addQuery(String name, Collection collection) 方法
 - add: ForestRequest.addQuery(String name, Object... array) 方法
 - add: ForestRequest.addArrayQuery(String name, Collection collection) 方法
 - add: ForestRequest.addArrayQuery(String name, Object... array) 方法
 
v1.5.3
- feat: Forest快捷接口 (#I4893Q (opens new window))
 - feat: 支持全局变量动态绑定方法 (#I478N2 (opens new window))
 - feat: 支持引用properties的字符串模板 (#I3P1QK (opens new window))
 - feat: 支持获取响应原因短语,即响应状态文本 (#I4BJVF (opens new window))
 - feat: 自定义组合注解 (#I4BISF (opens new window))
 - feat: 可自定义请求是否成功的条件 (#I4AEMT (opens new window))
 - feat: 可动态设置主机地址和端口号 (#I4AEJ8 (opens new window))
 - feat: 自定义重试条件 (#I493N3 (opens new window))
 - feat: 新增 OnRetry 回调函数 (#I493N6 (opens new window))
 - feat: 新增 
@Headers注解 (#I4BJQ6 (opens new window)) - feat: Forest请求接口继承规则 (#I4B0N7 (opens new window))
 - feat: 自动重定向控制 (#I4B0FM (opens new window))
 - feat: 全局变量支持动态绑定方法 (#I478N2 (opens new window))
 - feat: 在请求日志中显示后端框架名称 (#I4AKTD (opens new window))
 - feat: 新建forest-mock子项目 (#I468JB (opens new window))
 - fix: POST请求中,空Map无法转成{} JSON字符串 (#I455O2 (opens new window))
 - fix: 过滤器参数总是为第一个参数 (#I43VV0 (opens new window))
 - fix: 自定义请求头content-type会替换为大写 (#I46WNW (opens new window))
 - fix: 在Spring项目中如果不配置转换器就会找不到Converter (#I46FKV (opens new window))
 - fix: Response不带Content-Type和Content-Encoding头时无法正常解析 (#I455PO (opens new window))
 - fix: 当请求 302 请求时,Forest 会自动的访问重定向的url,导致 302 的响应头拿不到 (#I4AF3B (opens new window))
 - fix: SpringSSLKeyStore 在Spring中初始化失败
 - fix: 配置有ForestConfiguration参数的转换器的时候,在springboot中会初始化失败 (#I4AKT3 (opens new window))
 - fix: 在多线程环境下使用上传文件接口,运行时间长后会报出堆栈溢出的错误 (#I37UGY (opens new window))
 - fix: BeanPostProcessor 接口在低版本 springboot 环境下不兼容
 - opt: 优化 StringUtils 工具类方法
 - opt: 优化 URLUtils 工具类方法
 - add: SpringForestProperties类
 - add: 在所有请求注解中(如 
@Request,@Get)添加 responseEncoding 属性,用于强制指定响应数据的编码格式 - add: SpringForestObjectFactory类
 - add: ForestResponse.isRedirection 方法
 - add: ForestResponse.getRedirectionLocation 方法
 - add: ForestResponse.redirectionRequest 方法
 - add: ForestHeaderMap.clone 方法
 - add: ForestQueryMap.clone 方法
 - refactor: retryCount属性不在建议使用
 - update: 去掉MethodLifeCycle
 - refactor: 修改Forest接口扫描逻辑
 - refactor: 将 TypeReference 类改为抽象类
 
v1.5.1
- feat: 添加@URLEncode注解 (#I3SR0L (opens new window))
 - feat: 新增强制UrlEncoded的字符串模板 (#I3P1R0 (opens new window))
 - feat: 支持对gzip格式返回数据进行解压 (#I3SUSL (opens new window))
 - feat: spring项目通过定义Bean自动从Spring上下文中注入对应的ForestConverter (#I3E63M (opens new window))
 - fix: 在JSON或XML转换失败后,没有直接报错,而是转成了字符串 (#I3IUKC (opens new window))
 - fix: 在GET请求时带有空的body实体 (#I3RBR2 (opens new window))
 - fix: 去掉protobuf decoder 根据返回类型序列化
 - fix: 代理 (#I3E1MF (opens new window))
 - fix: 遇到非application/json的Response Header无法正常解析JSON (#I3AJSD (opens new window))
 - fix: 调用configuration.getLogHandler().setLogger()方法无效 (#I3IUKD (opens new window))
 - fix: okhttp后端情况下,response返回gzip或deflate压缩数据解析乱码 (#I3A54I (opens new window))
 - fix: 单向SSL不填protocol时报空指针
 - fix: statusCode空指针
 - fix: status在非网络错误情况下为404
 - fix: 修改方法名拼写错误 getDateType -> getDataType
 - update: 修改gson版本 -> 2.8.6
 - refactor: 指定统一的spring-boot版本
 - update: 去掉QLExpress
 - add: @URLEncode注解
 - add: URLEncodeLifeCycle类
 
v1.5.0
- feat: 支持application/octet-stream等二进制请求方式 (#I3B3UZ (opens new window))
 - feat: 变量未定义时,报错给予更友好的提示 (#I3DOAP (opens new window))
 - feat: 添加@Var注解,作为@DataVariable注解的简化快捷版本 (#I3E0FD (opens new window))
 - fix: ForestResponse<File>作为返回值使用@DownloadFile注解进行下载后getResult()为空(#I3DAEQ (opens new window))
 - add: ForestConfiguration#isVariableDefined方法
 - add: @Var注解
 - add: ResourceRequestBody类
 - add: ResourceRequestBodyBuilder类
 - add: MultipartRequestBody类
 - add: MultipartRequestBodyBuilder类
 - add: SupportFormUrlEncoded类
 - refactor: 将DataVariableLifeCycle改名为VariableLifeCycle
 - refactor: Body的解析方式改为构建器模式
 - refactor: ForestVariableUndefined.java 改名为 ForestVariableUndefinedException
 - update: 更新Spring-Core和Spring-Webmvc版本
 - update: 更新JUnit版本
 
v1.5.0-RC7
- fix: 反序列化XML为泛型类对象时报错 (#I3B5VH (opens new window))
 - fix: 全局配置的log-handler不起作用 (#I3B49O (opens new window))
 
v1.5.0-RC6
- feat: @LogHandler 和 @LogEnabled 注解作用域添加 ElementType.TYPE级别(#I3AHLC (opens new window))
 - feat: Query参数可以选择是否urlencoded
 - fix: 遇到非application/json的Response Header无法正常解析JSON (#I3AJSD (opens new window))
 - fix: 多模块开发多个@ForestScan注解只能扫描到其中一个注解的basePackages
 - fix: 基本类型判断漏掉了boolean
 - refactor: 将 gourpid 'spring-boot-starter-forest' 改为 'forest-spring-boot-starter'
 - refactor: 将 spring-boot-starter-forest 模块改名为 forest-spring-boot-starter
 - refactor: 将forest-spring-boot-starter模块下的包名修改为 'com.dtflys.forest.springboot'
 
v1.5.0-RC5
- feat: 可以从ForestResponse对象获取请求总耗时 (#I39O55 (opens new window))
 - fix: LogEnabled注解的logResponseContent在请求失败的情况下无效 (#I39M2G (opens new window))
 - add: ForestResponse.requestTime属性
 - add: ForestResponse.responseTime属性
 - add: ForestResponse.getTimeAsMillisecond方法
 
v1.5.0-RC4
- fix: 请求不能设置proxy用户名和密码 (#I36SJ8 (opens new window))
 - fix: https的url字符串会自动去掉 :80 端口部分 (#I38KEJ (opens new window))
 
v1.5.0-RC3
- fix: 全局配置重试次数,对 
[Forest] [Network Error]: Read timed out错误无效 (#I34X5D (opens new window)) - fix: URL井号(#)后面字符串没有encoding
 - fix: httpclient后端处理Cookie时产生'Invalid cookie header'的问题
 - refactor: 实现Interceptor接口时,不必强制实现onSuccess方法和onError方法
 
v1.5.0-RC2
- feat: 支持负数的字符串模板下标引用 (#I2BF4N (opens new window))
 - feat: @Query, @Body, @Header注解支持defaultValue默认值属性
 - fix: Fastjson使用JSONField注解的format属性设置日期格式没起效果 (#I29BFM (opens new window))
 - refactor: 去掉多余的System.out.println命令行输出
 - refactor: forest在spring的xml配置部分
 - add: @Query, @Body, @Header注解的defaultValue属性
 - add: jsr305依赖
 - add: ForestRequest.methodReturn方法和ForestRequest.getMethodReturnValue方法
 - update: 将错误拼写的方法名 handleSyncWicthException 改为 handleSyncWithException
 
v1.5.0-RC1
- feat: 处理Cookie (#I1QR18 (opens new window))
 - feat: 通过@FormBody注解将参数标识为表单格式的请求体 (#I28MY5 (opens new window))
 - feat: @Request、@Get、@Post等请求注解支持增加value属性作为url属性的别名 (#I28FWM (opens new window))
 - feat: 可以将Response返回的"true", "false"字符串转换成Boolean返回类型 (#I281O0 (opens new window))
 - fix: 用httpclient的方式上传文件会不成功,但用okhttp就是成功的 (#I28SA1 (opens new window))
 - fix: 遇到一些自定义的Response Content-Type,无法正常读取响应内容 (#I28PL7 (opens new window))
 - add: ForestCookies类
 - add: ForestCookie类
 - add: OnLoadCookie接口
 - add: OnSaveCookie接口
 
帮助我们改善此文档  (opens new window)
  上次更新: 2025/06/26, 02:14:36