idtitlesidebar_label
http_url
HTTP URL
HTTP URL

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

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

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

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

字符串模板传参

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

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

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

@Query 注解

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

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

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

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

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

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

:::caution

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

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