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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

Understanding Machine Learning

Understanding Machine Learning

Shai Shalev-Shwartz、Shai Ben-David / Cambridge University Press / 2014 / USD 48.51

Machine learning is one of the fastest growing areas of computer science, with far-reaching applications. The aim of this textbook is to introduce machine learning, and the algorithmic paradigms it of......一起来看看 《Understanding Machine Learning》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具