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



我的当前代码:

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-service调用,例如,通过扩展RestTemplate类,并把所有自定义头在那里?然后,所有我需要做的就是简单地使用我的自定义扩展RestTemplate而不是股票,并且所有我的自定义标题将在默认情况下出现在那里。

您可以使用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();

如果目标是有一个可重用的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();

在请求中添加"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());

我编写了一个方法来检查URL是否存在。我需要添加一个请求头。它是Groovy,但要适应Java应该相当简单。本质上我使用的是org.springframework.web.client.RestTemplate#execute(java.lang.String, org.springframework.http.HttpMethod, org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor<T>, java.lang.Object...) API方法。我猜您得到的解决方案至少部分取决于您想要执行的HTTP方法。从下面的例子中得到的关键是,我传递了一个Groovy闭包(方法restTemplate.execute()的第三个参数,在Java世界中,它或多或少是一个松散的Lambda),它被Spring API作为回调执行,以便能够在Spring执行命令

之前操作请求对象。
boolean isUrlExists(String url) {
    try {
      return (restTemplate.execute(url, HttpMethod.HEAD,
              { ClientHttpRequest request -> request.headers.add('header-name', 'header-value') },
              { ClientHttpResponse response -> response.headers }) as HttpHeaders)?.get('some-response-header-name')?.contains('some-response-header-value')
    } catch (Exception e) {
      log.warn("Problem checking if $url exists", e)
    }
    false
  }

最新更新