RestTemplate支持通过setRequestFactory设置HTTP请求客户端工具,支持jdk、httpclient、okHttp等,默认使用的是SimpleClientHttpRequestFactory,该工程使用的JDK实现,底层使用OutputStream来传递body数据,不支持GET传递body。
我们可以修改为httpclient,只需要使用HttpComponentsClientHttpRequestFactory,但是默认的httpclient的GET请求也是不支持传递body的。有两个用于定义Http请求的基础抽象类:HttpRequestBase、HttpEntityEnclosingRequestBase,前者扩展的不能传递body,而后者可以。
首先,引入httpClient依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
在config文件夹下创建HttpComponentsClientRestfulHttpRequestFactory.java
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;
/**
* @description 让RestTemplate的GET请求支持RequestBody参数
* @create 2021-04-30 09:26:15
*/
@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);
}
/**
* 定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据
*/
private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase {
public HttpGetRequestWithEntity(final URI uri) {
super.setURI(uri);
}
@Override
public String getMethod() {
return HttpMethod.GET.name();
}
}
}
在SpringBoot容器中加入RestTemplate
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
//给所有的Http请求加上请求头
restTemplate.setInterceptors(Collections.singletonList(new HeaderRequestInterceptor()));
//给请求的返回值加上自己的业务处理
restTemplate.setErrorHandler(new RestTemplateErrorHandler());
//给RestTemplate的get请求加上RequestBody
restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());
return restTemplate;
}
使用方法
String requestBody = "param"
restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(requestBody, null), Object.class)