spring boot设置公共请求头 springboot添加请求头_form表单提交设置请求头

【SpringBoot WEB 系列】WebClient 之请求头设置

在网络请求中,根据请求头的参数来做校验属于比较常见的一种 case 了,很多场景下我们发起的请求都需要额外的去设置请求头,本文将介绍 WebClient 设置请求头的两种姿势

I. 项目环境

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

1. 依赖

使用 WebClient,最主要的引入依赖如下(省略掉了 SpringBoot 的相关依赖,如对于如何创建 SpringBoot 项目不太清楚的小伙伴,可以关注一下我之前的博文)

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webfluxartifactId>
dependency>

2. REST 接口

基于 WebFlux 提供一个 http 接口,返回请求参数与请求头(关于 webflux 的用法在后续的 WebFlux 系列篇中给与介绍)

/**
 * 返回请求头
 *
 * @return
 */
@GetMapping(path = "withHeader")
public Mono withHeader(ServerHttpRequest request) {
    HttpHeaders headers = request.getHeaders();
    MultiValueMap params = request.getQueryParams();return Mono.just("-->headers: " + JSONObject.toJSONString(headers) + ";\t-->params:" +
            JSONObject.toJSONString(params));
}

II. 设置请求头

1. 默认请求头

在第一篇介绍 WebClient 创建的几种姿势中,WebClient.builder()方式创建时,可以指定默认的请求头,因此我们可以在创建时指定

// 1. 在创建时,指定默认的请求头
WebClient webClient = WebClient.builder().defaultHeader("User-Agent", "SelfDefine Header")
        .defaultHeader("referer", "localhost").baseUrl("http://127.0.0.1:8080").build();

Mono ans =
        webClient.get().uri("/withHeader?name={1}&age={2}", "一灰灰", 19).retrieve().bodyToMono(String.class);
ans.subscribe(s -> System.out.println("basic get with default header return: " + s));

通过上面这种方式创建的 webclient,所有的请求都会携带User-Agent: SelfDefine Header这个请求头哦

2. filter 方式

除了上面这种姿势之外,WebClient 还支持了 Filter,对于 Filter 你可以将它理解为 Servlet 中的 Filter,主要用于在发起请求时,做一些过滤操作,因此我们完全可以写一个塞入自定义请求头的 Filter

// 2. 使用filter
webClient = WebClient.builder().filter((request, next) -> {
    ClientRequest filtered = ClientRequest.from(request).header("filter-header", "self defined header").build();
    // 下面这一行可不能忘记,不然会出大事情
    return next.exchange(filtered);
}).baseUrl("http://127.0.0.1:8080").build();
ans = webClient.get().uri("/withHeader?name={1}&age={2}", "一灰灰", 19).retrieve().bodyToMono(String.class);
ans.subscribe(s -> System.out.println("basic get with filter header return: " + s));

请注意上面添加header的用法

3. 测试&小结

关于详细的测试代码可以在下面的工程源码中获取,下面给出上面两种姿势的返回结果

basic get with default header return: -->headers: {"accept-encoding":["gzip"],"host":["127.0.0.1:8080"],"accept":["*/*"],"User-Agent":["SelfDefine Header"],"referer":["localhost"]}; -->params:{"name":["一灰灰"],"age":["19"]}
basic get with filter header return: -->headers: {"accept-encoding":["gzip"],"user-agent":["ReactorNetty/0.9.1.RELEASE"],"host":["127.0.0.1:8080"],"accept":["*/*"],"filter-header":["self defined header"]}; -->params:{"name":["一灰灰"],"age":["19"]}

小结:

本文介绍两种请求头的设置方式

  • 通过WebClient.builder在创建时,通过defaultHeader指定默认的请求头
  • 借助 Filter,主动在Request中塞入请求头

III. 其他

0. 项目

系列博文

  • 【WEB 系列】WebClient 之基础使用姿势
  • 【WEB 系列】WebClient 之文件上传

源码

  • 工程:https://github.com/liuyueyi/spring-boot-demo
  • 源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/222-web-client

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激