最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

HTTPClient如何在Springboot中封裝工具類

 更新時間:2023年09月21日 09:29:14   作者:嶼麟  
這篇文章主要介紹了HTTPClient如何在Springboot中封裝工具類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

HTTPClient在Springboot中封裝工具類

添加依賴項

<!-- lombok常用工具集 -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>
<!-- hutool常用工具集 -->
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>4.1.0</version>
</dependency>
<!-- fastjson工具集 -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.59</version>
</dependency>

封裝工具類

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
/**
 * 基于httpclient封裝的http請求類,支持put/get/post
 *
 * @author leizhigang
 * @date 2020-07-09
 */
@Slf4j
public class YesHttpUtil {
    /**
     * 封裝httpRequest Get方法
     *
     * @param url
     * @param object
     * @return JsonObject
     */
    public String httpRequestGet (String url, Map<String,Object> paramsMap, Integer connectionTimeout) {
        try {
            HttpResponse response = HttpRequest.get(url)
                    .form(paramsMap)
                    .timeout(connectionTimeout)
                    .execute();
            if(response.getStatus() == 200) {
                String result = response.body();
                //JSONObject jsonResult = JSON.parseObject(result);
                return result;
            } else {
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                String errTime = dateFormat.format(new Date());
                log.error(errTime + "  response error(" + response.getStatus() + "):" + url);
                return null;
            }
        } catch (Exception ex) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            String errTime = dateFormat.format(new Date());
            log.error(errTime + "  request shell CRM error: " + ex.getMessage());
            return null;
        }
    }
    /**
     * 封裝httpRequest Post方法
     *
     * @param url
     * @param object
     * @return JsonObject
     */
    public JSONObject httpRequestPost (String url, String jsonBody,  Integer connectionTimeout) {
        try {
            // 向殼牌CRM發(fā)起請求,使用cn.hutool.http.HttpRequest,返回對象為cn.hutool.http.HttpResponse
            HttpResponse response = HttpRequest.post(url)
                    .contentType("application/json")
                    .timeout(connectionTimeout)
                    .body(jsonBody)
                    .execute();
            // 判斷請求狀態(tài)是否正常
            if(response.getStatus() == 200) {
                String result = response.body();
                com.alibaba.fastjson.JSONObject jsonResult = JSON.parseObject(result);
                return jsonResult;
            } else {
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                String errTime = dateFormat.format(new Date());
                log.error(errTime + "  response error(" + response.getStatus() + "):" + url);
                return null;
            }
        } catch (Exception ex){
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            String errTime = dateFormat.format(new Date());
            log.error(errTime + "  request shell CRM error: " + ex.getMessage());
            return null;
        }
    }
    /**
     * 封裝httpRequest Put方法
     *
     * @param url
     * @param object
     * @return JsonObject
     */
    public JSONObject httpRequestPut (String url, String jsonBody,  Integer connectionTimeout) {
        try {
            // 向殼牌CRM發(fā)起請求,使用cn.hutool.http.HttpRequest,返回對象為cn.hutool.http.HttpResponse
            HttpResponse response = HttpRequest.put(url)
                    .contentType("application/json")
                    .timeout(connectionTimeout)
                    .body(jsonBody)
                    .execute();
            // 判斷請求狀態(tài)是否正常
            if(response.getStatus() == 200) {
                String result = response.body();
                com.alibaba.fastjson.JSONObject jsonResult = JSON.parseObject(result);
                return jsonResult;
            } else {
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                String errTime = dateFormat.format(new Date());
                log.error(errTime + "  response error(" + response.getStatus() + "):" + url);
                return null;
            }
        } catch (Exception ex){
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            String errTime = dateFormat.format(new Date());
            log.error(errTime + "  request shell CRM error: " + ex.getMessage());
            return null;
        }
    }
    /**
     * 自定義httpPost方法,使用org.apache.http.client實現(xiàn)
     * 問題:請求超時,無法通過VPN請求接口,需進一步調(diào)試
     *
     * @param url
     * @param object
     * @return JsonObject
     */
    public static Object httpClientPost(String url, Object object, Integer connectionTimeout, Integer connectionRequestTimeout, Integer socketTimeout) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        // 設(shè)置請求的Config
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(connectionTimeout)
                .setConnectionRequestTimeout(connectionRequestTimeout)
                .setSocketTimeout(socketTimeout).build();
        httpPost.setConfig(requestConfig);
        // 設(shè)置請求的header
        httpPost.addHeader("Content-Type", "application/json; charset=utf-8");
        // 設(shè)置請求的body
        // JSONObject jsonParam = JSONObject.parseObject(JSONObject.toJSONString(registerMemberParam));
        String jsonString = JSONObject.toJSONString(object);
        StringEntity entity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
        // StringEntity entity = new UrlEncodedFormEntity(params,"UTF-8");
        entity.setContentEncoding("UTF-8");
        entity.setContentType("application/json");
        httpPost.setEntity(entity);
        // 執(zhí)行請求
        try {
            CloseableHttpResponse response = httpClient.execute(httpPost);
            System.out.println("得到的結(jié)果:" + response.getStatusLine());//得到請求結(jié)果
            HttpEntity entityResult = response.getEntity();//得到請求回來的數(shù)據(jù)
            // 解析返回結(jié)果
            String result = EntityUtils.toString(entityResult, "utf-8");
            JSONObject jsonObject = JSONObject.parseObject(result);
            // 打印執(zhí)行結(jié)果
            System.out.println(jsonObject);
            return jsonObject;
        } catch (Exception ex) {
            System.out.println("發(fā)送 POST 請求出現(xiàn)異常!" + ex);
            ex.printStackTrace();
            return null;
        }
    }
}

httpclient封裝工具類方式

在日常開發(fā)中,我們經(jīng)常需要通過http協(xié)議去調(diào)用網(wǎng)絡(luò)內(nèi)容,雖然java自身提供了net相關(guān)工具包,但是其靈活性和功能總是不如人意,于是有人專門搞出一個httpclient類庫,來方便進行Http操作。

對于httpcore的源碼研究,我們可能并沒有達到這種層次,在日常開發(fā)中也只是需要的時候,在網(wǎng)上百度一下,然后進行調(diào)用就行。

在項目中對于這個工具類庫也許沒有進行很好的封裝。

在哪里使用就寫在哪些,很多地方用到,就在多個地方寫。反正是復(fù)制粘貼,很方便,但是這樣就會導致項目中代碼冗余。

所以這里簡單的對httpcient的簡單操作封裝成一個工具類,統(tǒng)一放在項目的工具包中,在使用的時候直接從工具包中調(diào)用,不需要寫冗余代碼。

httpclient操作實例

首先需要在注意的一點是,這是基于httpclient4.5版本的,我們在使用的時候需要引入具體對應(yīng)jar。

下面是具體代碼示例

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
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.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils;
/**
 * 基于 httpclient 4.5版本的 http工具類
 * 
 * @author 愛琴孩
 * 
 */
public class HttpClientTool {
	private static final CloseableHttpClient httpClient;
	public static final String CHARSET = "UTF-8";
	// 采用靜態(tài)代碼塊,初始化超時時間配置,再根據(jù)配置生成默認httpClient對象
	static {
		RequestConfig config = RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(15000).build();
		httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
	}
	public static String doGet(String url, Map<String, String> params) {
		return doGet(url, params, CHARSET);
	}
	public static String doGetSSL(String url, Map<String, String> params) {
		return doGetSSL(url, params, CHARSET);
	}
	public static String doPost(String url, Map<String, String> params) throws IOException {
		return doPost(url, params, CHARSET);
	}
	/**
	 * HTTP Get 獲取內(nèi)容
	 * @param url 請求的url地址 ?之前的地址
	 * @param params 請求的參數(shù)
	 * @param charset 編碼格式
	 * @return 頁面內(nèi)容
	 */
	public static String doGet(String url, Map<String, String> params, String charset) {
		if (StringUtils.isBlank(url)) {
			return null;
		}
		try {
			if (params != null && !params.isEmpty()) {
				List<NameValuePair> pairs = new ArrayList<NameValuePair>(params.size());
				for (Map.Entry<String, String> entry : params.entrySet()) {
					String value = entry.getValue();
					if (value != null) {
						pairs.add(new BasicNameValuePair(entry.getKey(), value));
					}
				}
				// 將請求參數(shù)和url進行拼接
				url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));
			}
			HttpGet httpGet = new HttpGet(url);
			CloseableHttpResponse response = httpClient.execute(httpGet);
			int statusCode = response.getStatusLine().getStatusCode();
			if (statusCode != 200) {
				httpGet.abort();
				throw new RuntimeException("HttpClient,error status code :" + statusCode);
			}
			HttpEntity entity = response.getEntity();
			String result = null;
			if (entity != null) {
				result = EntityUtils.toString(entity, "utf-8");
			}
			EntityUtils.consume(entity);
			response.close();
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * HTTP Post 獲取內(nèi)容
	 * @param url 請求的url地址 ?之前的地址
	 * @param params 請求的參數(shù)
	 * @param charset 編碼格式
	 * @return 頁面內(nèi)容
	 * @throws IOException
	 */
	public static String doPost(String url, Map<String, String> params, String charset) 
			throws IOException {
		if (StringUtils.isBlank(url)) {
			return null;
		}
		List<NameValuePair> pairs = null;
		if (params != null && !params.isEmpty()) {
			pairs = new ArrayList<NameValuePair>(params.size());
			for (Map.Entry<String, String> entry : params.entrySet()) {
				String value = entry.getValue();
				if (value != null) {
					pairs.add(new BasicNameValuePair(entry.getKey(), value));
				}
			}
		}
		HttpPost httpPost = new HttpPost(url);
		if (pairs != null && pairs.size() > 0) {
			httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET));
		}
		CloseableHttpResponse response = null;
		try {
			response = httpClient.execute(httpPost);
			int statusCode = response.getStatusLine().getStatusCode();
			if (statusCode != 200) {
				httpPost.abort();
				throw new RuntimeException("HttpClient,error status code :" + statusCode);
			}
			HttpEntity entity = response.getEntity();
			String result = null;
			if (entity != null) {
				result = EntityUtils.toString(entity, "utf-8");
			}
			EntityUtils.consume(entity);
			return result;
		} catch (ParseException e) {
			e.printStackTrace();
		} finally {
			if (response != null)
				response.close();
		}
		return null;
	}
	/**
	 * HTTPS Get 獲取內(nèi)容
	 * @param url 請求的url地址 ?之前的地址
	 * @param params 請求的參數(shù)
	 * @param charset  編碼格式
	 * @return 頁面內(nèi)容
	 */
	public static String doGetSSL(String url, Map<String, String> params, String charset) {
		if (StringUtils.isBlank(url)) {
			return null;
		}
		try {
			if (params != null && !params.isEmpty()) {
				List<NameValuePair> pairs = new ArrayList<NameValuePair>(params.size());
				for (Map.Entry<String, String> entry : params.entrySet()) {
					String value = entry.getValue();
					if (value != null) {
						pairs.add(new BasicNameValuePair(entry.getKey(), value));
					}
				}
				url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));
			}
			HttpGet httpGet = new HttpGet(url);
			// https  注意這里獲取https內(nèi)容,使用了忽略證書的方式,當然還有其他的方式來獲取https內(nèi)容
			CloseableHttpClient httpsClient = HttpClientTool.createSSLClientDefault();
			CloseableHttpResponse response = httpsClient.execute(httpGet);
			int statusCode = response.getStatusLine().getStatusCode();
			if (statusCode != 200) {
				httpGet.abort();
				throw new RuntimeException("HttpClient,error status code :" + statusCode);
			}
			HttpEntity entity = response.getEntity();
			String result = null;
			if (entity != null) {
				result = EntityUtils.toString(entity, "utf-8");
			}
			EntityUtils.consume(entity);
			response.close();
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 這里創(chuàng)建了忽略整數(shù)驗證的CloseableHttpClient對象
	 * @return
	 */
	public static CloseableHttpClient createSSLClientDefault() {
		try {
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				// 信任所有
				public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
					return true;
				}
			}).build();
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		return HttpClients.createDefault();
	}
}

上面就是對于httpclient的簡單工具類,對于httpclient,還有很多知識點需要仔細研究。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot開發(fā)之利用Docker和Kubernetes部署微服務(wù)

    Springboot開發(fā)之利用Docker和Kubernetes部署微服務(wù)

    這篇文章主要介紹了如何將Spring Boot開發(fā)的微服務(wù)通過Docker容器化,并使用Kubernetes進行部署和管理,幫助讀者掌握現(xiàn)代云原生應(yīng)用的完整開發(fā)部署流程,有需要的可以了解下
    2025-03-03
  • MyBatis之二級緩存用法及說明

    MyBatis之二級緩存用法及說明

    本文介紹了MyBatis二級緩存的設(shè)計與實現(xiàn),涵蓋其在MyBatis中的位置、源碼解析、詳細使用案例、最佳實踐總結(jié)及源碼調(diào)試技巧等內(nèi)容,強調(diào)了設(shè)計模式的應(yīng)用,如裝飾器模式、模板方法模式等,并提供了緩存穿透、擊穿、雪崩等問題的解決方案
    2026-05-05
  • java Date獲取年月日時分秒的實現(xiàn)方法

    java Date獲取年月日時分秒的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava Date獲取年月日時分秒的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java編程BigDecimal用法實例分享

    Java編程BigDecimal用法實例分享

    這篇文章主要介紹了Java編程BigDecimal用法實例分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot中實現(xiàn)多文件打包下載的兩種方案

    SpringBoot中實現(xiàn)多文件打包下載的兩種方案

    在Spring Boot中實現(xiàn)多文件打包下載,一般是將多個文件壓縮成一個ZIP文件再進行下載,以下是兩種典型實現(xiàn)方案以及代碼示例,需要的朋友可以參考下
    2025-09-09
  • Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問題

    Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問題

    這篇文章主要介紹了Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問題,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 詳解如何在React中逃離閉包陷阱

    詳解如何在React中逃離閉包陷阱

    眾所周知,JavaScript 中的閉包(Closures)一定是這種語言最可怕的特性之一,另外它可能也是最隱蔽的語言特性之一,我們在編寫 React 代碼時經(jīng)常會用到它,但是大多數(shù)時候我們甚至沒有意識到這一點,本文小編將和大家一起深入探討如何在React中逃離閉包陷阱
    2023-09-09
  • Java基礎(chǔ)知識之注解、元注解

    Java基礎(chǔ)知識之注解、元注解

    ava 注解,從名字上看是注釋,解釋。但功能卻不僅僅是注釋那么簡單,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)知識之注解、元注解的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Java時間輪算法的實現(xiàn)代碼示例

    Java時間輪算法的實現(xiàn)代碼示例

    本篇文章主要介紹了Java時間輪算法的實現(xiàn)代碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Spring Boot 多環(huán)境配置Maven Profile vs 啟動參數(shù)注入深入解析

    Spring Boot 多環(huán)境配置Maven Profile vs 啟

    本文介紹了在Java項目開發(fā)和部署中使用多環(huán)境配置的方法,比較了兩種主要方式:MavenProfile方式和啟動參數(shù)方式,結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

昌邑市| 玉山县| 区。| 九寨沟县| 抚州市| 德庆县| 昭苏县| 北碚区| 桑植县| 高密市| 景洪市| 长岭县| 元朗区| 德清县| 阳西县| 西安市| 桐城市| 文昌市| 四川省| 城固县| 云林县| 新民市| 保德县| 晋中市| 宜丰县| 峡江县| 宝山区| 克山县| 城市| 任丘市| 忻州市| 高雄市| 彭州市| 扶沟县| 乡宁县| 子长县| 麻栗坡县| 龙门县| 丰县| 西昌市| 乳源|