Forest v1.5.9 版本发布,轻量级 HTTP 客户端框架

栏目: 软件资讯 · 发布时间: 2年前

内容简介:v1.5.9 版本发布了,此次更新主要解决了URL Encoder在某些情况下不正确的问题 为此自己重新实现了URL解析和URL编码,抛弃了原有的Java自带的URI对象解析和URLEncoder类 实现了URL语义化的字符串模板 自动区分模板...

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

项目介绍

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

颠覆医疗

颠覆医疗

[美]埃里克·托普 / 张南、魏薇、何雨师 / 译言·东西文库/电子工业出版社 / 2014-1-20 / 55.00

“创造性破坏”是奥地利经济学家约瑟夫·熊彼特最著名的理论,当一个产业在革新之时,都需要大规模地淘汰旧的技术与生产体系,并建立起新的生产体系。电器之于火器、汽车之于马车、个人计算机之于照排系统,都是一次又一次的“创造性破坏”,旧的体系完全不复存在,新的体系随之取代。 “创造性破坏”已经深深地改变了我们的生活,在这个数字时代,我们身边的一切都被“数字化”了。只有一处,也许是由于其本身的根深蒂固,......一起来看看 《颠覆医疗》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具