idtitlesidebar_label
http_header
HTTP Header
HTTP Header

在《构建接口》的例子中,我们已经知道了可以通过@Request注解的headers属性设置一条 HTTP 请求头。

现在我们来看看如何添加多条请求头。

headers属性

其中headers属性接受的是一个字符串数组,在接受多个请求头信息时以以下形式填入请求头:

  1. {
  2. "请求头名称1: 请求头值1",
  3. "请求头名称2: 请求头值2",
  4. "请求头名称3: 请求头值3",
  5. ...
  6. }

其中组数每一项都是一个字符串,每个字符串代表一个请求头。请求头的名称和值用:分割。

具体代码请看如下示例:

  1. public interface MyClient {
  2. @Request(
  3. url = "http://localhost:8080/hello/user",
  4. headers = {
  5. "Accept-Charset: utf-8",
  6. "Content-Type: text/plain"
  7. }
  8. )
  9. String multipleHeaders();
  10. }

该接口调用后所实际产生的 HTTP 请求如下:

  1. GET http://localhost:8080/hello/user
  2. HEADER:
  3. Accept-Charset: utf-8
  4. Content-Type: text/plain

如果要每次请求传入不同的请求头内容,可以在headers属性的请求头定义中加入数据绑定

  1. public interface MyClient {
  2. @Request(
  3. url = "http://localhost:8080/hello/user",
  4. headers = {
  5. "Accept-Charset: ${encoding}",
  6. "Content-Type: text/plain"
  7. }
  8. )
  9. String bindingHeader(@DataVariable("encoding") String encoding);
  10. }

如果调用方代码如下所示:

  1. myClient.bindingHeader("gbk");

这段调用所实际产生的 HTTP 请求如下:

  1. GET http://localhost:8080/hello/user
  2. HEADER:
  3. Accept-Charset: gbk
  4. Content-Type: text/plain

@Header 注解

想必大家都已经了解通过 headers 属性设置请求头的方法了。不过这种方式虽然直观,但如要没通过参数传入到请求头中就显得比较啰嗦了。

所以Forest还提供了 @Header 注解来帮助您把方法的参数直接绑定到请求体中。

  1. /**
  2. * 使用 @Header 注解将参数绑定到请求头上
  3. * @Header 注解的 value 指为请求头的名称,参数值为请求头的值
  4. * @Header("Accept") String accept将字符串类型参数绑定到请求头 Accept 上
  5. * @Header("accessToken") String accessToken将字符串类型参数绑定到请求头 accessToken 上
  6. */
  7. @Post("http://localhost:8080/hello/user?username=foo")
  8. void postUser(@Header("Accept") String accept, @Header("accessToken") String accessToken);

如果有很多很多的请求头要通过参数传入,我需要定义很多很多参数吗?当然不用!

  1. /**
  2. * 使用 @Header 注解可以修饰 Map 类型的参数
  3. * Map 的 Key 指为请求头的名称,Value 为请求头的值
  4. * 通过此方式,可以将 Map 中所有的键值对批量地绑定到请求头中
  5. */
  6. @Post("http://localhost:8080/hello/user?username=foo")
  7. void headHelloUser(@Header Map<String, Object> headerMap);
  8. /**
  9. * 使用 @Header 注解可以修饰自定义类型的对象参数
  10. * 依据对象类的 Getter 和 Setter 的规则取出属性
  11. * 其属性名为 URL 请求头的名称,属性值为请求头的值
  12. * 以此方式,将一个对象中的所有属性批量地绑定到请求头中
  13. */
  14. @Post("http://localhost:8080/hello/user?username=foo")
  15. void headHelloUser(@Header MyHeaderInfo headersInfo);

:::caution 注意

  • (1) 需要单个单个定义请求头的时候,@Header注解的value值一定要有,比如 @Header(“Content-Type”) String contentType

  • (2) 需要绑定对象的时候,@Header注解的value值一定要空着,比如 @Header MyHeaders headers@Header Map headerMap :::