<dependency><groupId>com.dtflys.forest</groupId> <artifactId>forest-spring-boot-starter</artifactId> <version>1.5.2-BETA</version> </dependency>
forest:timeout: 5000 # 请求超时时间,单位为毫秒(默认为 3000) connect-timeout: 5000 # 连接超时时间,单位为毫秒(默认为 timeout) read-timeout: 5000 # 数据读取超时时间,单位为毫秒(默认为 timeout) variables: message: 127.0.0.1:7778
message 这个是自定义的http接收的ip地址和端口
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); }
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方法 |
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);
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);
type | data属性数据绑定位置 | 支持的contentType或Content-Type请求头 |
---|---|---|
GET | url参数部分 | 只有application/x-www-form-urlencoded |
POST | 请求体 | 任何contentType |
PUT | 请求体 | 任何contentType |
PATCH | 请求体 | 任何contentType |
HEAD | url参数部分 | 只有application/x-www-form-urlencoded |
OPTIONS | url参数部分 | 只有application/x-www-form-urlencoded |
DELETE | url参数部分 | 只有application/x-www-form-urlencoded |
TRACE | url参数部分 | 只有application/x-www-form-urlencoded |
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);
@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 许可协议。转载请注明出处!
预览: