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

时间:2015-09-17 05:54:24

标签: java spring rest custom-headers

我目前的代码:

{"append see":0,"append horse":0,"exp horse":0....}

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

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而不是库存,默认情况下我的所有自定义标题都会出现在那里。

4 个答案:

答案 0 :(得分:25)

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

编辑:下面是更新的代码。 This link has several ways of calling rest service with examples

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();

答案 1 :(得分:15)

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

答案 2 :(得分:1)

这是我编写的一种检查 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 方法。下面示例的关键是我正在传递一个由 Spring API 执行的 Groovy 闭包(方法 restTemplate.execute() 的第三个参数,它或多或少,松散地说是 Java 世界中的 Lambda)在 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
  }

答案 3 :(得分:0)

向您的请求添加“ 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());