問(wèn)題
今天在使用RestTemplate請(qǐng)求es的接口時(shí),傳遞的json參數(shù)沒(méi)有起到作用。后面發(fā)現(xiàn)默認(rèn)的RestTemplate是不支持通過(guò)Body攜帶參數(shù)
原因
RestTemplate支持通過(guò)setRequestFactory設(shè)置HTTP請(qǐng)求客戶端工具,支持jdk、httpclient、okHttp等,默認(rèn)使用的是SimpleClientHttpRequestFactory,該工程使用的JDK實(shí)現(xiàn),底層使用OutputStream來(lái)傳遞body數(shù)據(jù),不支持GET傳遞body。
解決
1、
在pom.xml中添加依賴包,version在4.3.4及以上就可以
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>{your version}</version>
</dependency>
2、擴(kuò)展HttpComponentsClientHttpRequestFactory
package com.tencent.goff.configuration;
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 java.net.URI;
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實(shí)現(xiàn)HttpEntityEnclosingRequestBase抽象類,以支持GET請(qǐng)求攜帶body數(shù)據(jù)
*/
private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase {
public HttpGetRequestWithEntity(final URI uri) {
super.setURI(uri);
}
@Override
public String getMethod() {
return HttpMethod.GET.name();
}
}
}
3、在定義RestTemplate時(shí),使用自定義factory
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());
return restTemplate;
}
// 設(shè)置超時(shí)時(shí)間
private SimpleClientHttpRequestFactory getClientHttpRequestFactory() {
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
// Connect timeout 3s
clientHttpRequestFactory.setConnectTimeout(60000);
// Read timeout 3s
clientHttpRequestFactory.setReadTimeout(60000);
return clientHttpRequestFactory;
}
}
通過(guò)上面步驟解決了get請(qǐng)求不能穿body的問(wèn)題
參考https://www.it610.com/article/1290441629521485824.htm