id | title | sidebar_label |
---|---|---|
http_url | HTTP URL | HTTP URL |
HTTP请求可以没有请求头、请求体,但一定会有URL
,以及很多请求的参数都是直接绑定在URL
的Query
部分上。
基本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给URL
的Query
部分传参也有多种方式,其中最简洁直白的就数字符串拼接了。
/**
* 直接在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);
:::info 提示 @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 :::