使用RestTemplate發(fā)送GET請求,并且支持傳遞Request body參數(shù)

問題

今天在使用RestTemplate請求es的接口時,傳遞的json參數(shù)沒有起到作用。后面發(fā)現(xiàn)默認的RestTemplate是不支持通過Body攜帶參數(shù)

原因

RestTemplate支持通過setRequestFactory設(shè)置HTTP請求客戶端工具,支持jdk、httpclient、okHttp等,默認使用的是SimpleClientHttpRequestFactory,該工程使用的JDK實現(xiàn),底層使用OutputStream來傳遞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、擴展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實現(xiàn)HttpEntityEnclosingRequestBase抽象類,以支持GET請求攜帶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時,使用自定義factory

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {

        RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
        restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());
        return restTemplate;
    }

    // 設(shè)置超時時間
    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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容