问题 设置Spring RestTemplate的默认内容类型标头


我目前正在使用扩展Spring RestTemplate的OAuth2RestOperations,我想指定内容类型标头。

我唯一能做的就是在请求期间明确设置我的标题:

public String getResult() {
    String result = myRestTemplate.exchange(uri, HttpMethod.GET, generateJsonHeader(), String.class).getBody();
}

private HttpEntity<String> generateJsonHeader() {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    return new HttpEntity<>("parameters", headers);
}

但实际上很高兴能够在bean初始化期间一劳永逸地设置它,并直接使用getforObject方法而不是交换。


3536
2018-04-24 14:12


起源



答案:


首先,您必须创建请求拦截器:

public class JsonMimeInterceptor implements ClientHttpRequestInterceptor {

  @Override
  public ClientHttpResponse intercept(HttpRequest request, byte[] body,
        ClientHttpRequestExecution execution) throws IOException {
    HttpHeaders headers = request.getHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON);
    return execution.execute(request, body);
  }
}

...然后你有休息模板创建代码使用上面的拦截器:

@Configuration
public class MyAppConfig {

  @Bean
  public RestTemplate restTemplate() {
      RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
      restTemplate.setInterceptors(Collections.singletonList(new JsonMimeInterceptor()));
      return restTemplate;
  }
}

你可以继承 RestTemplate 如果您在应用程序中有一些其他专用或通用REST模板。


15
2018-04-24 15:40



感谢你的回答。在我的拦截器中,我添加了以下两行:headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); - Shahriar


答案:


首先,您必须创建请求拦截器:

public class JsonMimeInterceptor implements ClientHttpRequestInterceptor {

  @Override
  public ClientHttpResponse intercept(HttpRequest request, byte[] body,
        ClientHttpRequestExecution execution) throws IOException {
    HttpHeaders headers = request.getHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON);
    return execution.execute(request, body);
  }
}

...然后你有休息模板创建代码使用上面的拦截器:

@Configuration
public class MyAppConfig {

  @Bean
  public RestTemplate restTemplate() {
      RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
      restTemplate.setInterceptors(Collections.singletonList(new JsonMimeInterceptor()));
      return restTemplate;
  }
}

你可以继承 RestTemplate 如果您在应用程序中有一些其他专用或通用REST模板。


15
2018-04-24 15:40



感谢你的回答。在我的拦截器中,我添加了以下两行:headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); - Shahriar