Skip to main content
Version: 1.5.x

接口注解

@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);
}

@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);  
}

方法注解#

在 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);
}