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

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請求接口,需進(jìn)一步調(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類庫,來方便進(jìn)行Http操作。

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

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

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

所以這里簡單的對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ù)配置生成默認(rèn)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進(jìn)行拼接
				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)容,使用了忽略證書的方式,當(dāng)然還有其他的方式來獲取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,還有很多知識點需要仔細(xì)研究。

總結(jié)

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

相關(guān)文章

  • MyBatis 結(jié)果映射的兩種方式

    MyBatis 結(jié)果映射的兩種方式

    本文主要介紹了MyBatis的結(jié)果映射機(jī)制,包括基本結(jié)果映射、復(fù)雜結(jié)果映射以及動態(tài)結(jié)果映射和延遲加載,通過合理配置結(jié)果映射,可以簡化復(fù)雜查詢結(jié)果,感興趣的可以了解一下
    2024-11-11
  • Java讀文件修改默認(rèn)換行符的實現(xiàn)

    Java讀文件修改默認(rèn)換行符的實現(xiàn)

    這篇文章主要介紹了Java讀文件修改默認(rèn)換行符的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring 注解編程模型相關(guān)知識詳解

    Spring 注解編程模型相關(guān)知識詳解

    這篇文章主要介紹了Spring 注解編程模型相關(guān)知識詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • mybatis?mapper.xml中如何根據(jù)數(shù)據(jù)庫類型選擇對應(yīng)SQL語句

    mybatis?mapper.xml中如何根據(jù)數(shù)據(jù)庫類型選擇對應(yīng)SQL語句

    這篇文章主要介紹了mybatis?mapper.xml中如何根據(jù)數(shù)據(jù)庫類型選擇對應(yīng)SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java中CompleteFuture與Future的區(qū)別小結(jié)

    java中CompleteFuture與Future的區(qū)別小結(jié)

    本文主要介紹了java中CompleteFuture與Future的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • MapStruct @Mapping注解之處理映射中的Null值方式

    MapStruct @Mapping注解之處理映射中的Null值方式

    這篇文章主要介紹了MapStruct @Mapping注解之處理映射中的Null值方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • eclipse修改jvm參數(shù)調(diào)優(yōu)方法(2種)

    eclipse修改jvm參數(shù)調(diào)優(yōu)方法(2種)

    本篇文章主要介紹了eclipse修改jvm參數(shù)調(diào)優(yōu)方法(2種),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java構(gòu)造方法和方法重載詳解

    Java構(gòu)造方法和方法重載詳解

    大家好,本篇文章主要講的是Java構(gòu)造方法和方法重載詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • JavaWeb倉庫管理系統(tǒng)詳解

    JavaWeb倉庫管理系統(tǒng)詳解

    這篇文章主要為大家詳細(xì)介紹了JavaWeb倉庫管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java開源診斷工具Arthas使用方法詳解

    Java開源診斷工具Arthas使用方法詳解

    這篇文章主要介紹了Java開源診斷工具Arthas使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06

最新評論