编辑
2022-10-14
实用工具
00
请注意,本文编写于 908 天前,最后修改于 373 天前,其中某些信息可能已经过时。

目录

1.Forest框架介绍
2.Forest框架用法
请求方法
URL参数-GET
字符串模板
@Query注解
请求头
请求体-POST
@Body
表单
JSON

1.Forest框架介绍

  • Forest是一个高层的、极简的声明式HTTP调用API框架相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求
  • 官方gitee地址
  • 官方文档地址

2.Forest框架用法

  • 第一步先在项目的pom中引入forest
<dependency>
<groupId>com.dtflys.forest</groupId> <artifactId>forest-spring-boot-starter</artifactId> <version>1.5.2-BETA</version> </dependency>

  • 第二步在application.yml中配置参数
forest:
timeout: 5000 # 请求超时时间,单位为毫秒(默认为 3000) connect-timeout: 5000 # 连接超时时间,单位为毫秒(默认为 timeout) read-timeout: 5000 # 数据读取超时时间,单位为毫秒(默认为 timeout) variables: message: 127.0.0.1:7778

message 这个是自定义的http接收的ip地址和端口

  • 第三步定义一个client接口,填写完整具体的接收地址
import com.dtflys.forest.annotation.JSONBody; import com.dtflys.forest.annotation.Post; import java.util.Map; public interface MsgClient { @Post( url = "http://${message}/abcd/message/sendMsg?jsonData=${0}" ) Map<String, Object> sendMsg(@JSONBody String jsonData); }
  • 最后引用client实现发送消息 在需要发消息的时候引用MsgClient,再根据接口要求填上具体的参数名、参数参数值就可以实现消息的发送

请求方法

HTTP 请求方法请求注解描述
GET@Get、@GetRequest获取资源
POST@Post、@PostRequest 传输实体文本
PUT@Put、@PutRequest上传资源
HEAD@HeadRequest 获取报文首部
DELETE@Delete、@DeleteRequest删除资源
OPTIONS@Options、@OptionsRequest询问支持的方法
TRACE@Trace、@TraceRequest追踪路径
PATCH@Patch、@PatchRequest更新资源的某一部分
不定方法@Request可动态传入HTTP方法

例子

URL参数-GET

字符串模板

java
/** * 直接在url字符串的问号后面部分直接写上 参数名=参数值 的形式 * 等号后面的参数值部分可以用 {参数序号} 这种字符串模板的形式替代 * 在发送请求时会动态拼接成一个完整的URL * 使用这种形式不需要为参数定义额外的注解 * * 注:参数序号是从 0 开始记的方法参数的序号 * 0 代表第一个参数,1 代表第二个参数,以此类推 */ @Get("http://localhost:8080/abc?a={0}&b={1}&id=0") String send1(String a, String b); /** * 直接在url字符串的问号后面部分直接写上 参数名=参数值 的形式 * 等号后面的参数值部分可以用 {变量名} 这种字符串模板的形式替代 * 在发送请求时会动态拼接成一个完整的URL * 使用这种方式需要通过 @Var 注解或全局配置声明变量 */ @Get("http://localhost:8080/abc?a={a}&b={b}&id=0") String send2(@Var("a") String a, @Var("b") String b); /** * 如果一个一个变量包含多个Query参数,比如: "a=1&b=2&c=3" * 为变量 parameters 的字符串值 * 就用 ${变量名} 这种字符串模板格式 * 使用这种方式需要通过 @Var 注解或全局配置声明变量 */ @Get("http://localhost:8080/abc?${parameters}") String send3(@Var("parameters") String parameters);

@Query注解

java
/** * 使用 @Query 注解,可以直接将该注解修饰的参数动态绑定到请求url中 * 注解的 value 值即代表它在url的Query部分的参数名 */ @Get("http://localhost:8080/abc?id=0") String send(@Query("a") String a, @Query("b") String b); /** * 使用 @Query 注解,可以修饰 Map 类型的参数 * 很自然的,Map 的 Key 将作为 URL 的参数名, Value 将作为 URL 的参数值 * 这时候 @Query 注解不定义名称 */ @Get("http://localhost:8080/abc?id=0") String send1(@Query Map<String, Object> map); /** * @Query 注解也可以修饰自定义类型的对象参数 * 依据对象类的 Getter 和 Setter 的规则取出属性 * 其属性名为 URL 参数名,属性值为 URL 参数值 * 这时候 @Query 注解不定义名称 */ @Get("http://localhost:8080/abc?id=0") String send2(@Query UserInfo user); /* * 接受列表参数为URL查询参数 */ @Get("http://localhost:8080/abc") String send1(@Query("id") List idList); /* * json的方式传参 */ @Get("http://localhost:8080/abc") String send(@JSONQuery("id") List idList); // 使用 Lazy 作为 Query 的参数类型 @Post("/data") String sendData(@Query("a") String a, @Query("b") String b, @Query("token") Lazy<String> token);

请求头

动态请求头使用@Header注解

java
/** * 使用 @Header 注解将参数绑定到请求头上 * @Header 注解的 value 指为请求头的名称,参数值为请求头的值 * @Header("Accept") String accept将字符串类型参数绑定到请求头 Accept 上 * @Header("accessToken") String accessToken将字符串类型参数绑定到请求头 accessToken 上 */ @Post("http://localhost:8080/hello/user?username=foo") void postUser(@Header("Accept") String accept, @Header("accessToken") String accessToken); /** * 使用 @Header 注解可以修饰 Map 类型的参数 * Map 的 Key 指为请求头的名称,Value 为请求头的值 * 通过此方式,可以将 Map 中所有的键值对批量地绑定到请求头中 */ @Post("http://localhost:8080/hello/user?username=foo") void headHelloUser(@Header Map<String, Object> headerMap); /** * 使用 @Header 注解可以修饰自定义类型的对象参数 * 依据对象类的 Getter 和 Setter 的规则取出属性 * 其属性名为 URL 请求头的名称,属性值为请求头的值 * 以此方式,将一个对象中的所有属性批量地绑定到请求头中 */ @Post("http://localhost:8080/hello/user?username=foo") void headHelloUser(@Header MyHeaderInfo headersInfo);

请求体-POST

typedata属性数据绑定位置支持的contentType或Content-Type请求头
GETurl参数部分只有application/x-www-form-urlencoded
POST请求体任何contentType
PUT请求体任何contentType
PATCH请求体任何contentType
HEADurl参数部分只有application/x-www-form-urlencoded
OPTIONSurl参数部分只有application/x-www-form-urlencoded
DELETEurl参数部分只有application/x-www-form-urlencoded
TRACEurl参数部分只有application/x-www-form-urlencoded

@Body

java
/** * 默认body格式为 application/x-www-form-urlencoded,即以表单形式序列化数据 */ @Post("http://localhost:8080/user") String sendPost(@Body("username") String username, @Body("password") String password);

表单

java
/** * contentType属性设置为 application/x-www-form-urlencoded 即为表单格式, * 当然不设置的时候默认值也为 application/x-www-form-urlencoded, 也同样是表单格式。 * 在 @Body 注解的 value 属性中设置的名称为表单项的 key 名, * 而注解所修饰的参数值即为表单项的值,它可以为任何类型,不过最终都会转换为字符串进行传输。 */ @Post( url = "http://localhost:8080/user", contentType = "application/x-www-form-urlencoded" ) String sendPost(@Body("key1") String value1, @Body("key2") Integer value2, @Body("key3") Long value3);

JSON

@JSONBody注解可以修饰对象、键值对、集合对象、字符串

java
/** * 被@JSONBody注解修饰的参数会根据其类型被自定解析为JSON字符串 * 使用@JSONBody注解时可以省略 contentType = "application/json"属性设置 */ @Post("http://localhost:8080/hello/user") String helloUser(@JSONBody User user); //键值对 /** * 按键值对分别修饰不同的参数 * 这时每个参数前的 @JSONBody 注解必须填上 value 属性或 name 属性的值,作为JSON的字段名称 */ @Post("http://localhost:8080/hello/user") String helloUser(@JSONBody("username") String username, @JSONBody("password") String password); //集合对象 /** * 被@JSONBody注解修饰的Map类型参数会被自定解析为JSON字符串 */ @Post(url = "http://localhost:8080/hello/user") String helloUser(@JSONBody Map<String, Object> user); //字符串 /** * 直接修饰一个JSON字符串 */ @Post("http://localhost:8080/hello/user") String helloUser(@JSONBody String userJson);

除了@JSONBody注解,使用@Body注解也可以,只要将contentType属性或Content-Type请求头指定为application/json便可。

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.8