Spring TestRestTemplate 没有设置 headers
Spring TestRestTemplate doesn't set headers
我有下一个 REST 控制器方法:
@GetMapping("/product-group")
public List<ProductGroup> getAllProductGroups(@RequestHeader MultiValueMap<String, String> headers){
final String header = headers.getFirst("Access-Control-Request-Method");
assert header != null;
return repository.findAll();
}
并与 org.springframework.boot.test.web.client.TestRestTemplate
集成测试:
@Test
void allowAllHosts() {
final HttpHeaders headers = new HttpHeaders();
headers.setOrigin("localhost");
headers.setAccessControlRequestMethod(HttpMethod.GET);
final ResponseEntity<?> response = restTemplate.exchange("/product-group",
HttpMethod.GET,
new HttpEntity<>(headers),
String.class);
assertTrue(response.getHeaders().containsKey("Access-Control-Allow-Origin"), "CORS header doesn't presented");
}
上面的测试失败 header == null
。另外,我在调试器中检查了我添加的 headers 是否丢失。但呈现不同:
* "accept" -> "text/plain, application/json, application/*+json, */*"
* "user-agent" -> "Java/11.0.11"
* "host" -> "localhost:37795"
* "connection" -> "keep-alive"
为什么 TestRestTemplate
覆盖我的 headers 或者为什么它完全摆脱了它们?我怎样才能正确添加 headers?
问题来自“不允许headers”。 JDK 在请求期间忽略 headers 的预定义数组,包括 Access-Control-Request-Method
和 Origin
。
您可以找到详细的答案here。
总之,可以添加下一行代码:
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
并且 TestRestTemplate 将包括所有 headers.
我有下一个 REST 控制器方法:
@GetMapping("/product-group")
public List<ProductGroup> getAllProductGroups(@RequestHeader MultiValueMap<String, String> headers){
final String header = headers.getFirst("Access-Control-Request-Method");
assert header != null;
return repository.findAll();
}
并与 org.springframework.boot.test.web.client.TestRestTemplate
集成测试:
@Test
void allowAllHosts() {
final HttpHeaders headers = new HttpHeaders();
headers.setOrigin("localhost");
headers.setAccessControlRequestMethod(HttpMethod.GET);
final ResponseEntity<?> response = restTemplate.exchange("/product-group",
HttpMethod.GET,
new HttpEntity<>(headers),
String.class);
assertTrue(response.getHeaders().containsKey("Access-Control-Allow-Origin"), "CORS header doesn't presented");
}
上面的测试失败 header == null
。另外,我在调试器中检查了我添加的 headers 是否丢失。但呈现不同:
* "accept" -> "text/plain, application/json, application/*+json, */*"
* "user-agent" -> "Java/11.0.11"
* "host" -> "localhost:37795"
* "connection" -> "keep-alive"
为什么 TestRestTemplate
覆盖我的 headers 或者为什么它完全摆脱了它们?我怎样才能正确添加 headers?
问题来自“不允许headers”。 JDK 在请求期间忽略 headers 的预定义数组,包括 Access-Control-Request-Method
和 Origin
。
您可以找到详细的答案here。
总之,可以添加下一行代码:
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
并且 TestRestTemplate 将包括所有 headers.