美文网首页
使用RestTemplate发送GET请求,并且支持传递Requ

使用RestTemplate发送GET请求,并且支持传递Requ

作者: simperLv | 来源:发表于2020-10-21 16:41 被阅读0次

    问题

    今天在使用RestTemplate请求es的接口时,传递的json参数没有起到作用。后面发现默认的RestTemplate是不支持通过Body携带参数

    原因

    RestTemplate支持通过setRequestFactory设置HTTP请求客户端工具,支持jdk、httpclient、okHttp等,默认使用的是SimpleClientHttpRequestFactory,该工程使用的JDK实现,底层使用OutputStream来传递body数据,不支持GET传递body。

    解决

    1、
    在pom.xml中添加依赖包,version在4.3.4及以上就可以

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>{your version}</version>
            </dependency>
    

    2、扩展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实现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();
    
            }
        }
    }
    
    

    3、在定义RestTemplate时,使用自定义factory

    @Configuration
    public class RestTemplateConfig {
        @Bean
        public RestTemplate restTemplate() {
    
            RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
            restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());
            return restTemplate;
        }
    
        // 设置超时时间
        private SimpleClientHttpRequestFactory getClientHttpRequestFactory() {
            SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
            // Connect timeout 3s
            clientHttpRequestFactory.setConnectTimeout(60000);
            // Read timeout 3s
            clientHttpRequestFactory.setReadTimeout(60000);
            return clientHttpRequestFactory;
        }
    }
    

    通过上面步骤解决了get请求不能穿body的问题
    参考https://www.it610.com/article/1290441629521485824.htm

    相关文章

      网友评论

          本文标题:使用RestTemplate发送GET请求,并且支持传递Requ

          本文链接:https://www.haomeiwen.com/subject/ziremktx.html