欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring集成httpclient配置的詳細(xì)過程

 更新時間:2021年07月01日 14:18:38   作者:A_yes  
spring框架是一個非常強(qiáng)大的框架這里就不多說了,那么主要是介紹spring與httpclient的整合集成過程,感興趣的朋友跟隨小編一起看看吧

一、簡介

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。

下載地址: http://hc.apache.org/downloads.cgi

二、特性

1. 基于標(biāo)準(zhǔn)、純凈的java語言。實現(xiàn)了Http1.0和Http1.1

2. 以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實現(xiàn)了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS協(xié)議。

4. 通過Http代理建立透明的連接。

5. 利用CONNECT方法通過Http代理建立隧道的https連接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認(rèn)證方案。

7. 插件式的自定義認(rèn)證方案。

8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。

9. 連接管理器支持多線程應(yīng)用。支持設(shè)置最大連接數(shù),同時支持設(shè)置每個主機(jī)的最大連接數(shù),發(fā)現(xiàn)并關(guān)閉過期的連接。

10. 自動處理Set-Cookie中的Cookie。

11. 插件式的自定義Cookie策略。

12. Request的輸出流可以避免流中內(nèi)容直接緩沖到socket服務(wù)器。

13. Response的輸入流可以有效的從socket服務(wù)器直接讀取相應(yīng)內(nèi)容。

14. 在http1.0和http1.1中利用KeepAlive保持持久連接。

15. 直接獲取服務(wù)器發(fā)送的response code和 headers。

16. 設(shè)置連接超時的能力。

17. 實驗性的支持http1.1 response caching。

18. 源代碼基于Apache License 可免費(fèi)獲取。

spring httpclient

HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了,越來越多的 Java 應(yīng)用程序需要直接通過 HTTP 協(xié)議來訪問網(wǎng)絡(luò)資源。雖然在 JDK 的 java.net 包中已經(jīng)提供了訪問 HTTP 協(xié)議的基本功能,但是對于大部分應(yīng)用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。

spring與httpclient集成方式如下:

引入jar包

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>

2.編寫執(zhí)行g(shù)et和post請求的java類

package com.wee.common.service;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.wee.common.bean.HttpResult;

@Service
public class HttpClientService {

    @Autowired
    private CloseableHttpClient httpClient;
    @Autowired
    private RequestConfig requestConfig;

    /**
     * 執(zhí)行GET請求
     * 
     * @param url
     * @return
     * @throws IOException
     * @throws ClientProtocolException
     */
    public String doGet(String url) throws ClientProtocolException, IOException {
        // 創(chuàng)建http GET請求
        HttpGet httpGet = new HttpGet(url);
        httpGet.setConfig(this.requestConfig);

        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行請求
            response = httpClient.execute(httpGet);
            // 判斷返回狀態(tài)是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } finally {
            if (response != null) {
                response.close();
            }
        }
        return null;
    }

    /**
     * 帶有參數(shù)的GET請求
     * 
     * @param url
     * @param params
     * @return
     * @throws URISyntaxException
     * @throws IOException
     * @throws ClientProtocolException
     */
    public String doGet(String url, Map<String, String> params)
            throws ClientProtocolException, IOException, URISyntaxException {
        URIBuilder uriBuilder = new URIBuilder(url);
        for (String key : params.keySet()) {
            uriBuilder.addParameter(key, params.get(key));
        }
        return this.doGet(uriBuilder.build().toString());
    }

    /**
     * 執(zhí)行POST請求
     * 
     * @param url
     * @param params
     * @return
     * @throws IOException
     */
    public HttpResult doPost(String url, Map<String, String> params) throws IOException {
        // 創(chuàng)建http POST請求
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(this.requestConfig);
        if (params != null) {
            // 設(shè)置2個post參數(shù),一個是scope、一個是q
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            for (String key : params.keySet()) {
                parameters.add(new BasicNameValuePair(key, params.get(key)));
            }
            // 構(gòu)造一個form表單式的實體
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8");
            // 將請求實體設(shè)置到httpPost對象中
            httpPost.setEntity(formEntity);
        }

        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行請求
            response = httpClient.execute(httpPost);
            return new HttpResult(response.getStatusLine().getStatusCode(),
                    EntityUtils.toString(response.getEntity(), "UTF-8"));
        } finally {
            if (response != null) {
                response.close();
            }
        }
    }

    /**
     * 執(zhí)行POST請求
     * 
     * @param url
     * @return
     * @throws IOException
     */
    public HttpResult doPost(String url) throws IOException {
        return this.doPost(url, null);
    }

    /**
     * 提交json數(shù)據(jù)
     * 
     * @param url
     * @param json
     * @return
     * @throws ClientProtocolException
     * @throws IOException
     */
    public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException {
        // 創(chuàng)建http POST請求
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(this.requestConfig);

        if (json != null) {
            // 構(gòu)造一個form表單式的實體
            StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
            // 將請求實體設(shè)置到httpPost對象中
            httpPost.setEntity(stringEntity);
        }

        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行請求
            response = this.httpClient.execute(httpPost);
            return new HttpResult(response.getStatusLine().getStatusCode(),
                    EntityUtils.toString(response.getEntity(), "UTF-8"));
        } finally {
            if (response != null) {
                response.close();
            }
        }
    }

}
 HttpResult.java

public class HttpResult {

    /**
     * 狀態(tài)碼
     */
    private Integer status;
    /**
     * 返回數(shù)據(jù)
     */
    private String data;

    public HttpResult() {
    }

    public HttpResult(Integer status, String data) {
        this.status = status;
        this.data = data;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

}

3.spring和httpClient整合配置文件

<!-- 定義連接管理器 -->
    <bean id="httpClientConnectionManager"
        class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager"
        destroy-method="close">
        <!-- 最大連接數(shù) -->
        <property name="maxTotal" value="${http.maxTotal}" />

        <!-- 設(shè)置每個主機(jī)地址的并發(fā)數(shù) -->
        <property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}" />
    </bean>

    <!-- httpclient對象構(gòu)建器 -->
    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
        <!-- 設(shè)置連接管理器 -->
        <property name="connectionManager" ref="httpClientConnectionManager" />
    </bean>

    <!-- 定義Httpclient對象 -->
    <bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient"
        factory-bean="httpClientBuilder" factory-method="build" scope="prototype">
    </bean>

    <!-- 定義清理無效連接 -->
    <bean class="com.taotao.common.httpclient.IdleConnectionEvictor"
        destroy-method="shutdown">
        <constructor-arg index="0" ref="httpClientConnectionManager" />
    </bean>

    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
        <!-- 創(chuàng)建連接的最長時間 -->
        <property name="connectTimeout" value="${http.connectTimeout}"/>
        <!-- 從連接池中獲取到連接的最長時間 -->
        <property name="connectionRequestTimeout" value="${http.connectionRequestTimeout}"/>
        <!-- 數(shù)據(jù)傳輸?shù)淖铋L時間 -->
        <property name="socketTimeout" value="${http.socketTimeout}"/>
        <!-- 提交請求前測試連接是否可用 -->
        <property name="staleConnectionCheckEnabled" value="${http.staleConnectionCheckEnabled}"/>
    </bean>
    <!-- 定義請求參數(shù) -->
    <bean id="requestConfig" class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder" factory-method="build">
    </bean>

4.httpclient.properties

httpClient.maxTotal=200
httpClient.defaultMaxPerRoute=50
httpClient.connectTimeout=1000
httpClient.connectionRequestTimeout=500
httpClient.socketTimeout=10000
httpClient.staleConnectionCheckEnabled=true

5.使用一個單獨(dú)的線程完成連接池中的無效鏈接的清理

package com.wee.common.httpclient;

import org.apache.http.conn.HttpClientConnectionManager;

public class IdleConnectionEvictor extends Thread {

    private final HttpClientConnectionManager connMgr;

    private volatile boolean shutdown;

    public IdleConnectionEvictor(HttpClientConnectionManager connMgr) {
        this.connMgr = connMgr;
        // 啟動當(dāng)前線程
        this.start();
    }

    @Override
    public void run() {
        try {
            while (!shutdown) {
                synchronized (this) {
                    wait(5000);
                    // 關(guān)閉失效的連接
                    connMgr.closeExpiredConnections();
                }
            }
        } catch (InterruptedException ex) {
            // 結(jié)束
        }
    }

    public void shutdown() {
        shutdown = true;
        synchronized (this) {
            notifyAll();
        }
    }
}

到此這篇關(guān)于spring集成httpclient配置的文章就介紹到這了,更多相關(guān)spring httpclient配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中實現(xiàn)String字符串用逗號隔開

    Java中實現(xiàn)String字符串用逗號隔開

    這篇文章主要介紹了Java中實現(xiàn)String字符串用逗號隔開,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • JDBC中Statement的Sql注入問題詳解

    JDBC中Statement的Sql注入問題詳解

    這篇文章主要介紹了JDBC中Statement的Sql注入問題詳解,sql注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入web應(yīng)用程序,而這些輸入大都是sql語法里的一些組合,通過執(zhí)行sql語句進(jìn)而執(zhí)行攻擊者所要做的操作,需要的朋友可以參考下
    2023-10-10
  • Java設(shè)計模式之java原型模式詳解

    Java設(shè)計模式之java原型模式詳解

    這篇文章主要介紹了Java設(shè)計模式之原型模式詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • 在Elasticsearch中添加字段的詳細(xì)步驟

    在Elasticsearch中添加字段的詳細(xì)步驟

    在ES中,增加字段相對比較容易,因為ES支持動態(tài)映射(Dynamic Mapping),這篇文章主要給大家介紹了關(guān)于在Elasticsearch中添加字段的詳細(xì)步驟,文中給出了詳細(xì)的代碼實例,需要的朋友可以參考下
    2024-07-07
  • MyBatis創(chuàng)建存儲過程的實例代碼_動力節(jié)點(diǎn)Java學(xué)院整理

    MyBatis創(chuàng)建存儲過程的實例代碼_動力節(jié)點(diǎn)Java學(xué)院整理

    本節(jié)需要用到的有2部分,第一部分是如何在Derby中創(chuàng)建存儲過程,第二部分是如何在Mybatis中調(diào)用存儲過程,具體實例代碼大家參考下本文吧
    2017-09-09
  • IDEA中實現(xiàn)springboot熱部署方式

    IDEA中實現(xiàn)springboot熱部署方式

    在IDEA中實現(xiàn)SpringBoot的熱部署可以通過修改設(shè)置來完成,首先在設(shè)置中搜索Compiler,并勾選Build project automatically,然后進(jìn)入Advanced Settings,勾選Allow auto-make to start even if developed application is currently running
    2024-09-09
  • 淺談Spring Security 對于靜態(tài)資源的攔截與放行

    淺談Spring Security 對于靜態(tài)資源的攔截與放行

    這篇文章主要介紹了淺談Spring Security 對于靜態(tài)資源的攔截與放行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 在SpringBoot中使用HATEOAS的方法

    在SpringBoot中使用HATEOAS的方法

    這篇文章主要介紹了在SpringBoot中使用HATEOAS的方法,HATEOAS是實現(xiàn)REST規(guī)范的一種原則,通過遵循HATEOAS規(guī)范,可以解決我們實際代碼實現(xiàn)的各種個問題,下文更多相關(guān)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Maven屬性與版本管理詳細(xì)步驟分解

    Maven屬性與版本管理詳細(xì)步驟分解

    這篇文章主要介紹了Maven中關(guān)于屬性與版本控制管理的步驟操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java構(gòu)建對象常用3種方法解析

    Java構(gòu)建對象常用3種方法解析

    這篇文章主要介紹了Java構(gòu)建對象常用3種方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論