WireMock 中请求头匹配与响应配置的一些实践
记录用 WireMock 挡服务时,通过 JSON 映射文件和 Java API 做请求头匹配、响应头与响应体配置的两种方式及细节。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-12 04:15:47 Spring RestTemplate GET请求 请求头 Java
有段时间没写直接调 HTTP 接口的代码了,最近碰到一个场景需要在 GET 请求里塞上 Authorization 和几个业务头,习惯性地想用 RestTemplate 的 getForObject,结果发现根本传不了自定义 Headers。
稍微翻了下文档,得用 exchange 方法,顺便就把整个流程跑通了,这里记录一下,省得下次再从头翻。
依赖很简单,pom.xml 里加上 spring-web 就行,我用的 5.3.23,当时项目 Spring Boot 版本带的正好是这个,如果你用更高版本应该也没啥问题。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>resttemplate-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.23</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>com.example.RestTemplateDemo</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
代码部分,核心就是三步:构建 HttpHeaders、包成 HttpEntity、然后用 exchange 发出去。别用 getForObject 或者 getForEntity,那两个都没地方让你塞请求头,线上因为这个吃过亏,请求发出去对方一直报 401,查了半天发现头根本没带过去。
下面是完整的可运行示例,我把注释也写里面了,看起来直观点。
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import java.util.Collections;
public class RestTemplateDemo {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
// 拼请求头,这里按照实际需要加
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your_token_here");
headers.set("X-Custom-Header", "value123");
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// 封装成 HttpEntity,GET 请求体就是 null,其实我们没传 body,构造函数自动处理了
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
// 目标 URL,参数用占位符,防止自己拼字符串出问题
String url = "https://api.example.com/data?param1={param1}";
// 发请求,必须用 exchange
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.GET,
requestEntity,
String.class,
Collections.singletonMap("param1", "test_value")
);
// 看看返回了啥
System.out.println("Status Code: " + response.getStatusCode());
System.out.println("Response Body: " + response.getBody());
System.out.println("Response Headers: " + response.getHeaders());
}
}
把这两个文件放到标准 Maven 项目结构里,src/main/java/com/example/ 下面放 Java 文件,pom.xml 放项目根目录,然后执行 mvn clean compile exec:java 就能跑起来。
如果你只是想验证,直接复制到 IDE 里也行。
这个地方其实容易踩坑的细节还有几个:HttpHeaders 的 set 方法会覆盖同名的旧值,如果同一个头要传多个值,得用 add。还有 setAccept 那里得用 Collections.singletonList,不能直接传单个 MediaType,不然编译不过。
另外 exchange 方法最后一个参数是 uriVariables,如果 URL 里没有占位符,可以省略或者传 null,但建议保持占位符的习惯,避免特殊字符转义问题。
至于接收响应,用了 ResponseEntity,可以直接拿到状态码、响应头、响应体,后面不管是转成对象还是做错误处理都方便。如果返回的是 JSON,把 String.class 换成你对应的实体类,再配合 MappingJackson2HttpMessageConverter 就能自动反序列化,不过那就需要额外引入 jackson-databind 依赖,这里就不展开了。
总之,RestTemplate 的 GET 请求想带自定义头,忘掉 getForObject,直接用 exchange 构建 HttpEntity 完事儿。
记录用 WireMock 挡服务时,通过 JSON 映射文件和 Java API 做请求头匹配、响应头与响应体配置的两种方式及细节。
记录在 Aspose.PDF 里加载本地 TTF 字体,以及绕过 TTC 格式不支持问题的两种可行方案。
跑单测突然报 Command line is too long,大多数情况在 Run Configuration 里勾一个选项就完事。这里把原因和几种方案一起记一下。
Spring循环依赖不仅导致启动失败,更隐藏着设计缺陷。本手册将从实战角度出发,详细讲解如何识别循环依赖的常见模式,剖析其在构造函数和字段注入下的表现。更重要的是,我们提供了从组件重新设计、`@Lazy`注解到AOP配置检查等一系列实用诊疗方案和预防性最佳实践,旨在帮助开发者从根本上避免并高效解决循环依赖,构建健壮可维护的Spring应用。