RestTemplate設置Header說明

一、RestTemplate設置編碼

在實際開發中,尤其是在處理中文數據時,我們需要在設置Header的同時設置編碼格式,以保證請求和響應的數據能夠正確傳輸和解析。可以使用RestTemplate的構造函數提供的方法設置編碼格式。

RestTemplate restTemplate = new RestTemplate(new StringHttpMessageConverter(Charset.forName("UTF-8")));

這樣設置後,不管是請求還是響應的數據,都將使用UTF-8編碼進行轉換處理。如果需要其他編碼格式,只需要替換「UTF-8」即可。

二、RestTemplate設置代理

在部分應用場景下,我們需要使用代理進行請求和響應的轉發,可以通過調用RestTemplate的setRequestFactory方法,來設置使用代理。

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress("代理地址", 埠號));
requestFactory.setProxy(proxy);
RestTemplate restTemplate = new RestTemplate(requestFactory);

以上代碼中,「代理地址」和「埠號」需要替換為實際使用的值。這樣設置後,RestTemplate會使用指定的代理進行請求和響應的轉發。

三、RestTemplate設置Content-Type

在實際開發中,我們需要在請求中設置Content-Type來指定請求體的類型,以便於伺服器進行解析和處理。可以通過在HttpHeaders中添加Content-Type來設置。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity requestEntity = new HttpEntity(requestJson, headers);
ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);

以上代碼通過設置HttpHeaders的Content-Type為APPLICATION_JSON,來指定請求體的類型為JSON格式。

四、RestTemplate官網

RestTemplate是Spring框架提供的一個HTTP客戶端工具,具有簡單方便、易於使用的優點。在RestTemplate的官網上,提供了詳細的API文檔和代碼示例,方便開發者學習和使用。

RestTemplate官網鏈接:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

五、RestTemplate怎麼讀

RestTemplate中的「Template」代表模板,RestTemplate可以說是SpringMVC中的Rest部分的”模板”,提供了更方便、更高效的HTTP調用介面。

六、RestTemplate詳解

RestTemplate提供了諸如postForObject、getForEntity等方法,以便於我們能夠像調用本地方法一樣,使用RestTemplate來實現HTTP請求。例如:

//使用Map封裝參數
Map queryParams = new HashMap();
queryParams.put("id", 1);
//調用RestTemplate的getForObject方法,實現GET請求
response = restTemplate.getForObject(url, String.class, queryParams);

RestTemplate還支持反序列化,將HTTP響應的JSON/XML數據,轉化成Java對象。可以使用Jackson、Gson等第三方庫進行數據反序列化,也可以使用RestTemplate自帶的反序列化器,可以註解方式進行配置。

七、RestTemplate高並發

在高並發場景中,如果使用RestTemplate來請求遠程介面,可能會導致請求響應時間過長的問題。可以通過以下幾種方法解決:

1、在RestTemplate中使用連接池,提升連接復用的性能和效率。

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(20);
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(HttpClients.custom().setConnectionManager(connectionManager).build()));

2、使用緩存機制,需先根據業務自行選擇。

//HttpClient對象,維護連接池
CloseableHttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(200).setMaxConnPerRoute(20).build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setConnectTimeout(timeout);
requestFactory.setReadTimeout(timeout);
RestTemplate restTemplate = new RestTemplate(requestFactory);

//緩存管理對象
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
requestFactory.setConnectTimeout(timeout);
requestFactory.setReadTimeout(timeout);
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setBufferRequestBody(false);
factory.setTaskExecutor(new SimpleAsyncTaskExecutor());
BufferingClientHttpRequestFactory bufferingClientHttpRequestFactory = new BufferingClientHttpRequestFactory(factory);
RestTemplate restTemplate = new RestTemplate(bufferingClientHttpRequestFactory);
RestOperations restOperations = restTemplate;
CachingRestOperations cachingRestOperations = new CachingRestTemplate(restOperations);

3、Request和Response數據壓縮,可壓縮以下編碼類型gzip、deflat等,建議結合實際數據進行選擇;

/**
 * RestTemplate配置
 */
@Configuration
public class RestTemplateConfig {

    @Autowired
    private RestTemplateBuilder restTemplateBuilder;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        //連接池配置
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(200);
        connectionManager.setDefaultMaxPerRoute(20);

        //請求配置
        RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000).setConnectTimeout(5000).setSocketTimeout(5000).build();

        //將連接池和請求配置組合為結果
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig).build();

        //設置壓縮方式
        httpClient.addInterceptorFirst(new HttpRequestInterceptor() {
            @Override
            public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
                if (request instanceof HttpEntityEnclosingRequest) {
                    HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
                    Header ceheader = entity.getContentEncoding();
                    if (ceheader != null) {
                        for (HeaderElement codec : ceheader.getElements()) {
                            if (codec.getName().equalsIgnoreCase("gzip")) {
                                ((HttpEntityEnclosingRequest) request).setEntity(new GzipCompressingEntity(entity));
                                return;
                            }
                            if (codec.getName().equalsIgnoreCase("deflate")) {
                                ((HttpEntityEnclosingRequest) request).setEntity(new DeflateCompressingEntity(entity));
                                return;
                            }
                        }
                    }
                }
            }
        });

        //設置壓縮方式
        httpClient.addInterceptorFirst(new HttpResponseInterceptor() {
            @Override
            public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    Header ceheader = entity.getContentEncoding();
                    if (ceheader != null) {
                        HeaderElement[] codecs = ceheader.getElements();
                        for (int i = 0; i < codecs.length; i++) {
                            if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                                response.setEntity(new GzipDecompressingEntity(entity));
                                return;
                            }
                            if (codecs[i].getName().equalsIgnoreCase("deflate")) {
                                response.setEntity(new DeflateDecompressingEntity(entity));
                                return;
                            }
                        }
                    }
                }
            }
        });
        return new HttpComponentsClientHttpRequestFactory(httpClient);
    }
}

八、RestTemplate遠程調用選取

在實際開發中,我們需要根據不同的業務場景,選擇不同的遠程調用方式,以滿足業務需求。常用的遠程調用方式有以下幾種:

1、同步調用:使用RestTemplate的execute、postForEntity、exchange等同步方法實現,能夠較為方便地獲取到返回結果和處理異常。

//同步調用
public ResponseEntity invokeSync(String url, HttpMethod method, HttpHeaders headers, Object requestBody) throws Exception {
    HttpEntity requestEntity = new HttpEntity(requestBody, headers);
    ResponseEntity responseEntity = restTemplate.exchange(url, method, requestEntity, String.class);
    if (responseEntity.getStatusCode() != HttpStatus.OK) {
        throw new Exception("");
    }
    return responseEntity;
}

2、非同步調用:使用RestTemplate配合AsyncRestTemplate實現,能夠使用回調方法處理返回結果和異常情況,相對於同步調用,能夠提高並發能力。

//非同步調用
public ListenableFuture<ResponseEntity> invokeAsync(String url, HttpMethod method, HttpHeaders headers, Object requestBody) {
    HttpEntity requestEntity = new HttpEntity(requestBody, headers);
    ListenableFuture<ResponseEntity> future = asyncRestTemplate.exchange(url, method, requestEntity, String.class);
    future.addCallback(new ListenableFutureCallback<ResponseEntity>() {
        @Override
        public void onSuccess(ResponseEntity result) {
            //處理返回結果
        }

        @Override
        public void onFailure(Throwable ex) {
            //處理異常情況
        }
    });
    return future;
}

3、消息轉換器:使用RestTemplate的消息轉換器實現,能夠將HTTP請求/響應數據轉換成對象,方便業務處理。

//消息轉換器
public Person invokeWithConverter(String url, HttpMethod method, HttpHeaders headers, Person person) {
    HttpEntity requestEntity = new HttpEntity(person, headers);
    ResponseEntity responseEntity = restTemplate.exchange(url, method, requestEntity, Person.class);
    if (responseEntity.getStatusCode() != HttpStatus.OK) {
        return null;
    }
    return responseEntity.getBody();
}

以上代碼示例,展示了RestTemplate設置Header的相關知識點。在實際開發中,我們需要根據具體需要,結合官方文檔和API文檔,選擇合適的方法和調用方式,以提高開發效率和應用性能。

原創文章,作者:FCKUE,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/373074.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FCKUE的頭像FCKUE
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相關推薦

發表回復

登錄後才能評論