Forest v1.5.9 版本发布,轻量级 HTTP 客户端框架
v1.5.9 版本发布了,此次更新主要解决了URL Encoder在某些情况下不正确的问题
为此自己重新实现了URL解析和URL编码,抛弃了原有的Java自带的URI对象解析和URLEncoder类
实现了URL语义化的字符串模板
自动区分模板参数属于URL的哪个部分
/** * 新版本能够识别 {a} 和 {b} 是一个URL的Query参数 * 会按照查询参数的要求进行URL编码:会将'&'符号转义 * 而 {path} 会被识别URL路径的一部分 * 会按照URL路径的要求来进行URL编码:会保留'&'符号,不做转义 */ @Get("/data/{path}?a={a}&b={b}") String getData(@Var("path") String path, @Var("a") String a, @Var("b") String b);
{}
与${}
的区别
{}
代表一个Query参数
{}
模板参数,在?a={a}
的情况下,会被认为是一个Query参数,即便变量可能包含"1&x=10&y=20"这样多个参数的字符串,也会被转义成一个Query参数
@Get("http://localhost/data?a={a}&b={b}") String getData(@Var("a") String a, @Var("b") String b)
// 最终产生的URL是 // http://localhost/data?a=1%26x%3D10%26y%3D20&b=hello // 也就是只会有 a 和 b 两个Query参数 myClient.getData("1&x=10&y=20", "hello");
${}
可以包含多个Query参数
而 ${}
模板参数,可以认为是一种字符串替换,替换完再对URL参数进行解析,所以一个模板参数引用的变量中可能包含多个参数,也会被解析成多个参数
@Get("http://localhost/data?a=${a}&b=${b}") String getData(@Var("a") String a, @Var("b") String b)
// 最终产生的URL是 // http://localhost/data?a=1&x=10&y=20&b=hello // 也就是只会有 a、x、y、b 四个Query参数 myClient.getData("1&x=10&y=20", "hello");
推荐使用{}
作为模板参数
基于这两种模板参数各自的特性,都各有各的用处,但一般情况下,推荐使用{}
因为它更结构化、更语义化,也更容易让人理解,不容易出错,尤其是在URL参数中传递另一个URL地址时的作用更为突出
比如,要传一个带参数的子URL:https://search.gitee.com/?type=repository&q=forest
接到父URL后为 http://localhost/data?call={url}
如果是用${url}
就会出问题
@Get("/data?call=${url}") String getData(@Var("url") String url); // 最后产生的URL是 // http://localhost/data?call=https://search.gitee.com/?type=repository&q=forest
咋看起来没错,但最后那部分&q=forest
会被认为是父URL的Query参数,但其实应该是子URL的
如果用 {url}
就没关系,即使后来再有其它参数也毫无问题
@Get("/data?call={url}&x={x}") String getData(@Var("url") String url, @Var("x") String x); // 最后产生的URL是 // http://localhost/data?call=https://search.gitee.com/?type=repository%26q=forest&x=xxx
可以看到,子URL中Query参数的连接符&
被转义了,这样就解决了子URL参数和父URL参数(如后面的x
)之间产生的歧义
FIX的BUG
- fix: URI路径的URLEncoder编码结果不正确 (#I4DUFG:URI路径的URLEncoder编码结果不正确)
项目介绍
Forest是一个高层的、极简的轻量级HTTP调用API框架。
相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求。
文档和示例
发送JSON数据
/** * 将对象参数解析为JSON字符串,并放在请求的Body进行传输 */ @Post("/register") String registerUser(@JSONBody MyUser user); /** * 将Map类型参数解析为JSON字符串,并放在请求的Body进行传输 */ @Post("/test/json") String postJsonMap(@JSONBody Map mapObj); /** * 直接传入一个JSON字符串,并放在请求的Body进行传输 */ @Post("/test/json") String postJsonText(@JSONBody String jsonText);
发送XML数据
/** * 将一个通过JAXB注解修饰过的类型对象解析为XML字符串 * 并放在请求的Body进行传输 */ @Post("/message") String sendXmlMessage(@XMLBody MyMessage message); /** * 直接传入一个XML字符串,并放在请求的Body进行传输 */ @Post("/test/xml") String postXmlBodyString(@XMLBody String xml);
发送Protobuf数据
/** * ProtobufProto.MyMessage 为 Protobuf 生成的数据类 * 将 Protobuf 生成的数据对象转换为 Protobuf 格式的字节流 * 并放在请求的Body进行传输 * * 注: 需要引入 google protobuf 依赖 */ @Post(url = "/message", contentType = "application/octet-stream") String sendProtobufMessage(@ProtobufBody ProtobufProto.MyMessage message);
详细文档请看:http://forest.dtflyx.com

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
官宣|Apache Flink 1.14.0 发布公告
作者 |Stephan Ewen & Johannes Moser 翻译 |宋辛童 在 Apache 软件基金会近期发布的年度报告中,Apache Flink 再次跻身最活跃项目前 5 名!该项目最新发布的 1.14.0 版本同样体现了其非凡的活跃力,囊括了来自超过 200 名贡献者的 1000 余项贡献。整个社区为项目的推进付出了持之以恒的努力,我们引以为傲。 新版本在 SQL API、更多连接器支持、Checkpoint 机制、PyFlink 等多个方面带来了大量的新特性与改进。其中一个主要的改进是针对流批一体的使用体验。我们相信,在实践中,对无界的数据流的处理与对有界的批数据的处理是密不可分的,因为很多场景都需要在处理实时数据流的同时处理来自各种数据源的历史数据。例如开发新应用时的数据探索、新应用的状态初始化、用于流式应用的训练模型、升级或修复后的数据重处理等。 在 Flink 1.14 中,我们终于可以在同一个应用当中混合使用有界流和无界流:Flink 现在支持对部分运行、部分结束的应用(部分算子已处理到有界输入数据流的末端)做 Checkpoint。此外,Flink ...
- 下一篇
J2PaaS 低代码示例项目演示系统 V1.0 正式发布
J2PaaS-examples是J2PaaS低代码开发平台的案例演示系统,内置J2PaaS平台开发的代表性案例及功能插件,如图表报表样式,控件组件样式、页面布局演示等。 在线演示地址:https://jikaiyun.com/Points 平台源码下载:https://gitee.com/j2paas 柱状图案例: 页面布局: 资产管理系统案例: J2PaaS是吉鼎科技基于20年技术沉淀和项目经验而研发的综合性开发平台,覆盖了软件项目需求分析、设计、开发、测试、运行、维护与管理等全过程。 平台为开发者提供开发引擎、运行引擎、项目管理,实现低成本、高效率的软件系统定制开发及应用,是“把编程变简单,甚至不需要编程”作为核心理念, 打破传统开发用“代码编程”驱动产品的模式,升级为用“参数”驱动产品,打造可视化、组件化、低代码、拖拽式开发的在线敏捷开发平台。 同时,平台把常规需要程序员完成的功能集成在框架中,开发人员只需关注业务逻辑、页面的组装以及流程的设计等业务相关的功能,低层功能例如事务处理、 文件处理、 数据库操作等等开发平台已经内置自动完成,它不仅是一个开发平台,还是强有力的生产力工具...
相关文章
文章评论
共有0条评论来说两句吧...