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

use*_*216 25 java rest spring custom-headers

我目前的代码:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Mall[] malls = restTemplate.getForObject(url, Mall[].class);
Run Code Online (Sandbox Code Playgroud)

我需要在表单中为我的请求添加一些自定义标头:

X-TP-DeviceID : <GUID>
Run Code Online (Sandbox Code Playgroud)

在我的案例中,最简单的方法是什么?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();
Run Code Online (Sandbox Code Playgroud)

[添加]

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

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

ksw*_*ghs 32

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

编辑:下面是更新的代码.此链接有几种方法可以通过示例调用休息服务

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();
Run Code Online (Sandbox Code Playgroud)

  • 请澄清“参数”在 HttpEntity ctor 中的含义。这是一个神奇的值(必须正是那个),是否有可以使用的常量,还是被忽略了?广告中的 Thx。 (2认同)

k_o*_*_o_ 25

如果目标是拥有一个可重用的 RestTemplate,它通常可用于将相同的标头附加到一系列类似的请求中,则org.springframework.boot.web.client.RestTemplateCustomizer可以将参数与 一起使用RestTemplateBuilder

 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();
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这个被否决到了负面的程度,因为它对我来说似乎完全正确,一旦我从 RestTemplateBuilder (在我的例子中不是一个 spring-boot 项目)中纯化它,它就完美地工作了。 (3认同)

Sea*_*dea 6

向您的请求添加“User-Agent”标头。

一些服务器试图阻止蜘蛛程序和抓取程序访问他们的服务器,因为在早期,请求没有发送用户代理标头。

您可以尝试设置自定义用户代理值或使用一些标识浏览器的值,例如“Mozilla/5.0 Firefox/26.0”

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();

headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("user-agent", "Mozilla/5.0 Firefox/26.0");
headers.set("user-key", "your-password-123"); // optional - in case you auth in headers
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
ResponseEntity<Game[]> respEntity = restTemplate.exchange(url, HttpMethod.GET, entity, Game[].class);

logger.info(respEntity.toString());
Run Code Online (Sandbox Code Playgroud)