<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 许可协议。转载请注明出处!