原文取自:spring resttemplate get请求支持body_resttemplate get body_wangooo的博客-CSDN博客
resttemplate时不允许发送带有body的get请求的,因为 get 请求是HttpGet,HttpGet 继承 HttpRequestBase,HttpRequestBase 是不支持传递body的。
HttpEntityEnclosingRequestBase是可以传递body的,那就自定义一个工厂继承HttpComponentsClientHttpRequestFactory,重写createHttpUriRequest方法,当发送的请求是GET请求时,创建自定义的继承HttpEntityEnclosingRequestBase的类,这样GET请求就可以传送body。
代码:创建一个config包创建其中之一的config配置:HttpComponentsClientRestFulHttpRequestFactory
package com.example.clienthttpbin.demos.config; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpUriRequest; import org.springframework.http.HttpMethod; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Component; import java.net.URI; /** * @author ShiGuoLi */ @Component public class HttpComponentsClientRestFulHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { @Override protected HttpUriRequest createHttpUriRequest( HttpMethod httpMethod, URI uri ) { if ( httpMethod == HttpMethod.GET ) { return new HttpGetRequestWithEntity( uri ); } return super.createHttpUriRequest( httpMethod, uri ); } private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase { public HttpGetRequestWithEntity( final URI uri ) { super.setURI( uri ); } @Override public String getMethod( ) { return HttpMethod.GET.name(); } } }
然后再创建第二个config
package com.example.clienthttpbin.demos.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; /** * @author ShiGuoLi */ @Configuration public class RestTemplateConfig { @Bean (name="remoteRestTemplate") public RestTemplate restTemplate( ClientHttpRequestFactory simpleClientHttpRequestFactory){ RestTemplate restTemplate = new RestTemplate(simpleClientHttpRequestFactory); restTemplate.setRequestFactory(new HttpComponentsClientRestFulHttpRequestFactory()); return restTemplate; } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(60000); factory.setReadTimeout(20000); return factory; } }
当调用的方法带有@RequestBody时,header中要设置成json格式
headers.setContentType( MediaType.APPLICATION_JSON );