将我的自定义http标头添加到Spring RestTemplate请求/扩展RestTemplate

2022-08-31 23:54:32

我当前的代码:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Mall[] malls = restTemplate.getForObject(url, Mall[].class);

我需要为我的请求添加一些自定义标头,格式如下:

X-TP-DeviceID : <GUID>

就我而言,最简单的方法是什么?有没有办法在将请求发送到服务器之前将自定义标头定义添加到我的对象?restTemplate

[编辑]

这是正确的吗?

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

HttpHeaders headers = new HttpHeaders();
headers.set("X-TP-DeviceID", "1234567890");
HttpEntity entity = new HttpEntity(headers);

HttpEntity<Mall[]> response = restTemplate.exchange(url, HttpMethod.GET, entity, Mall[].class);

Mall[] malls = response.getBody();

[已添加]

所以,我设法让它工作。但是,我对此并不完全满意。在我的情况下,我需要为我进行的所有调用提供相同的自定义标头。

因此,我的下一个问题是 - 是否可以将我的自定义标头设置为在每次调用时自动添加,例如,通过扩展类并将所有自定义标头放在那里?然后,我需要做的就是简单地使用我的自定义扩展而不是库存扩展,并且默认情况下我的所有自定义标头都将显示在那里。web-serviceRestTemplateRestTemplate


答案 1

您可以使用 RestTemplate 交换方法传递自定义 http 标头,如下所示。

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON }));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-TP-DeviceID", "your value");

HttpEntity<RestRequest> entityReq = new HttpEntity<RestRequest>(request, headers);

RestTemplate template = new RestTemplate();

ResponseEntity<RestResponse> respEntity = template
    .exchange("RestSvcUrl", HttpMethod.POST, entityReq, RestResponse.class);

编辑:下面是更新的代码。此链接具有几种调用 rest 服务的方法,并提供示例

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-TP-DeviceID", "your value");

HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<Mall[]> respEntity = restTemplate.exchange(url, HttpMethod.POST, entity, Mall[].class);

Mall[] resp = respEntity.getBody();

答案 2

如果目标是拥有一个可重用的 RestTemplate,这通常对于将同一标头附加到一系列类似的请求很有用,则参数可以与以下参数一起使用:org.springframework.boot.web.client.RestTemplateCustomizerRestTemplateBuilder

 String accessToken= "<the oauth 2 token>";
 RestTemplate restTemplate = new RestTemplateBuilder(rt-> rt.getInterceptors().add((request, body, execution) -> {
        request.getHeaders().add("Authorization", "Bearer "+accessToken);
        return execution.execute(request, body);
    })).build();