自定义自己的interceptor
public class ScClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
//重写实现方法
}
}
配置httpclient (用于发送请求),并为restTemplate注入interceptor
@Bean
@ConditionalOnProperty(value = "com.social.credits.infra.fiber.enabled", matchIfMissing = true)
public HttpClient httpClient() {
return FiberHttpClientBuilder.
create(httpIoThread). // use io threads
setMaxConnPerRoute(httpConnPerRoute).
setMaxConnTotal(httpConnMax).build();
}
/**
* set restTemplate http client
* 构造使用Apache的httpclient
* if use restTemplate.getInterceptors().add(new ScClientHttpRequestInterceptor()); may get null from result
*/
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
factory.setConnectionRequestTimeout(connectionRequestTimeout);
factory.setReadTimeout(readTimeout);
// 构造加入interceptor
List<ClientHttpRequestInterceptor> interceptorList = new ArrayList<>();
interceptorList.add(new ScClientHttpRequestInterceptor()); //自己实现的interceptor
InterceptingClientHttpRequestFactory interceptorFactory = new InterceptingClientHttpRequestFactory(new BufferingClientHttpRequestFactory(factory), interceptorList);
restTemplate.setRequestFactory(interceptorFactory);
return restTemplate;
}
总结
在为RestTemplate注入interceptor的时候要选择 InterceptingClientHttpRequestFactory interceptorFactory = new InterceptingClientHttpRequestFactory(new BufferingClientHttpRequestFactory(factory), interceptorList); 这个构造函数,不然会导致restTemplate getbody return null error
参考链接:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/BufferingClientHttpRequestFactory.html (getbody return null!!)
http://springinpractice.com/2013/11/01/how-to-pretty-print-your-json-with-spring-and-jackson/ http://www.ibm.com/developerworks/library/j-tracemt/index.html