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

問(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

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

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