🧁 接口注解
# @BaseRequest 注解
@BaseRequest注解定义在接口类上,在@BaseRequest上定义的属性会被分配到该接口中每一个方法上,但方法上定义的请求属性会覆盖@BaseRequest上重复定义的内容。
因此可以认为@BaseRequest上定义的属性内容是所在接口中所有请求的默认属性。
/**
 * @BaseRequest 为配置接口层级请求信息的注解
 * 其属性会成为该接口下所有请求的默认属性
 * 但可以被方法上定义的属性所覆盖
 */
@BaseRequest(
    baseURL = "http://localhost:8080",     // 默认域名
    headers = {
        "Accept:text/plain"                // 默认请求头
    },
    sslProtocol = "TLS"                    // 默认单向SSL协议
)
public interface MyClient {
  
    // 方法的URL不必再写域名部分
    @Get("/hello/user")
    String send1(@Query("username") String username);
    // 若方法的URL是完整包含http://开头的,那么会以方法的URL中域名为准,不会被接口层级中的baseURL属性覆盖
    @Get("http://www.xxx.com/hello/user")
    String send2(@Query("username") String username);
  
    @Get(
        url = "/hello/user",
        headers = {
            "Accept:application/json"      // 覆盖接口层级配置的请求头信息
        }
    )     
    String send3(@Query("username") String username);
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@BaseRequest注解中的所有字符串属性都可以通过模板表达式进行变量引用。
/** 
 * 若全局变量中已定义 baseUrl 和 accept,
 * 便会将全局变量中的值绑定到 @BaseRequest 的属性中
 */
@BaseRequest(
    baseURL = "${baseUrl}",     // 默认域名
    headers = {
        "Accept:${accept}"      // 默认请求头
    }
)
public interface MyClient {
    // 方法的URL的域名将会引用全局变量中定义的 baseUrl
    @Get("/hello/user")     
    String send1(@Query("username") String username);
    // @BaseRequest 中的属性亦可以引用方法中的绑定变量名的参数
    @Get("/hello/user")
    String send2(@Var("baseUrl") String baseUrl);
  
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 方法注解
在 Forest 中,方法注解(除了@Post这类请求注解之外)也可以放置在 interface 接口上,其注解效果会涵盖接口下的所有方法
如果方法上有同样的注解,则会覆盖接口上注解的配置信息
/**
 * @Backend 是一个方法维度的注解,但也可以挂在接口上
 * 它可以为接口下的每一个方法请求设置HTTP后端框架
 * 所以该接口下所有请求默认都会使用 OkHttp3
 */
@Backend("okhttp3")
@Address(host = "localhost", port = "8080")
public interface MyClient {
    /**
     * 使用接口默认后端框架,即 OkHttp3
     */
    @Post("/data1")
    String sendData1(@Body MyData data);
    /**
     * 使用接口默认后端框架,即 OkHttp3
     */
    @Post("/data2")
    String sendData2(@Body MyData data);
    /**
     * 使用了接口上相同的注解 @Backend
     * 覆盖了改接口默认后端框架配置
     * 所以该请求会使用 HttpClient 作为后端框架
     */
    @Backend("httpclient")
    @Post("/data3")
    String sendData3(@Body MyData data);
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
帮助我们改善此文档  (opens new window)
  上次更新: 2025/06/24, 01:16:57