Version: 1.5.x

HTTP URL

HTTP请求可以没有请求头、请求体,但一定会有URL,以及很多请求的参数都是直接绑定在URLQuery部分上。

基本URL设置方法就如简单请求的例子所示,只要在url属性中填入完整的请求地址即可。

除此之外,也可以从外部动态传入URL:

/**
* 整个完整的URL都通过 @DataVariable 注解修饰的参数动态传入
*/
@Request("${myURL}")
String send1(@DataVariable("myURL") String myURL);
/**
* 通过参数转入的值值作为URL的一部分
*/
@Request("http://${myURL}/abc")
String send2(@DataVariable("myURL") String myURL);

字符串模板传参

HTTP的URL不光有协议名、域名、端口号等等基本信息,更为重要的是它能携带各种参数,称为Query参数,它通常包含参数名和参数值两部分。

Forest给URLQuery部分传参也有多种方式,其中最简洁直白的就数字符串拼接了。

/**
* 直接在url字符串的问号后面部分直接写上 参数名=参数值 的形式
* 等号后面的参数值部分可以用 ${变量名} 这种字符串模板的形式替代
* 在发送请求时会动态拼接成一个完整的URL
*/
@Request("http://localhost:8080/abc?a=${a}&b=${b}&id=0")
String send2(@DataVariable("a") String a, @DataVariable("b") String b);

@Query 注解

但把所有Query参数直接写在url属性的字符串里面是不是也太简单粗暴了,有没有优雅点的方式?有的。

/**
* 使用 @Query 注解,可以直接将该注解修饰的参数动态绑定到请求url中
* 注解的 value 值即代表它在url的Query部分的参数名
*/
@Request("http://localhost:8080/abc?id=0")
String send2(@Query("a") String a, @Query("b") String b);
提示

@Query 与 @DataParam 不同,@Query 注解修饰的参数一定会出现在 URL 中,而 @DataParam 修饰的参数则要视情况而定。

若是要传的URL参数太多了呢?难道要我在方法上定义十几二十个@Query修饰的参数?那也太难看了吧。别急,Forest还是有办法让您变的代码变得优雅的。

/**
* 使用 @Query 注解,可以修饰 Map 类型的参数
* 很自然的,Map 的 Key 将作为 URL 的参数名, Value 将作为 URL 的参数值
* 这时候 @Query 注解不定义名称
*/
@Get("http://localhost:8080/abc?id=0")
String send2(@Query Map<String, Object> map);
/**
* @Query 注解也可以修饰自定义类型的对象参数
* 依据对象类的 Getter 和 Setter 的规则取出属性
* 其属性名为 URL 参数名,属性值为 URL 参数值
* 这时候 @Query 注解不定义名称
*/
@Get("http://localhost:8080/abc?id=0")
String send2(@Query UserInfo user);

是不是瞬间简洁不少,但用@Query注解绑定参数的时候也有需要注意的地方:

caution
  • (1) 需要单个单个定义 参数名=参数值 的时候,@Query注解的value值一定要有,比如 @Query("name") String name

  • (2) 需要绑定对象的时候,@Query注解的value值一定要空着,比如 @Query User user 或 @Query Map map

Last updated on