HttpClient 工具類分享

引:記錄個人使用的的工具類

https://github.com/fxbin

package cn.fxbin.bubble.core.util;

import cn.fxbin.bubble.core.constant.CharsetPool;
import cn.fxbin.bubble.core.constant.StringPool;
import com.alibaba.fastjson.JSONObject;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.*;
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.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.lang.Nullable;

import java.io.IOException;
import java.net.URI;
import java.util.*;

/**
 * HttpUtils
 *
 * <p>
 * 參見:
 *  <a href="#">http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html</a>
 * </p>
 *
 * @author fxbin
 * @version v1.0
 * @since 2019/11/15 14:43
 */
@Slf4j
@UtilityClass
public class HttpUtils {


    /**
     * http get request
     *
     * @author fxbin
     * @since 2019/11/17 18:04
     * @param url url
     * @return java.lang.String
     */
    public String get(String url) {
        return get(url, null);
    }


    /**
     * http get request with parameter
     *
     * @author fxbin
     * @since 2019/11/17 18:04
     * @param url url
     * @param object object
     * @return java.lang.String
     */
    public String get(String url, @Nullable Object object) {
        return request(url, HttpGet.METHOD_NAME, object);
    }


    /**
     * http post request
     *
     * @author fxbin
     * @since 2019/11/17 18:19
     * @param url url
     * @return java.lang.String
     */
    public String post(String url) {
        return post(url, null);
    }


    /**
     * http post request with parameter
     *
     * @author fxbin
     * @since 2019/11/17 18:19
     * @param url url
     * @param object request parameter
     * @return java.lang.String
     */
    public String post(String url, @Nullable Object object) {
        return request(url, HttpPost.METHOD_NAME, object);
    }


    /**
     * request
     *
     * @author fxbin
     * @since 2019/11/17 18:03
     * @param url url
     * @param method http method
     * @param object object
     * @return java.lang.String
     */
    private String request(String url, String method, Object object) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {

            RequestBuilder requestBuilder = RequestBuilder
                    .create(method)
                    .setConfig(getRequestConfig())
                    .setUri(buildUri(url, object));

            if (ObjectUtils.isNotEmpty(object) && object instanceof String) {
                StringEntity entity = null;
                if (JsonUtils.isJsonString(String.valueOf(object))) {
                    entity = new StringEntity(String.valueOf(object), ContentType.APPLICATION_JSON);
                    entity.setContentEncoding(StringPool.UTF8);
                } else {
                    entity = new StringEntity(String.valueOf(object), ContentType.TEXT_HTML);
                    entity.setContentEncoding(StringPool.UTF8);
                }
                requestBuilder.setEntity(entity);
            }

            HttpUriRequest httpUriRequest = requestBuilder.build();

            try (CloseableHttpResponse response = httpclient.execute(httpUriRequest)) {
                HttpEntity entity = response.getEntity();

                // 臨時重定向, 可能性: 80 --> 443
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_TEMPORARY_REDIRECT) {
                    String redirectUri = response.getFirstHeader("location").getValue();
                    return post(redirectUri, object);
                }

                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    // 轉化響應結果,並設置編碼
                    return EntityUtils.toString(entity, StringPool.UTF8);
                }
            } catch (IOException e) {
                log.error("CloseableHttpResponse deal with execute failed ", e);
            }
        } catch (Exception e) {
            log.error("http request failed, url: {}", url, e);
        } finally {
            try {
                httpclient.close();
            } catch (IOException e) {
                log.error("CloseableHttpClient close failed", e);
            }
        }
        return "";
    }


    /**
     * buildUri build uri
     *
     * @author fxbin
     * @since 2019/11/17 18:01
     * @param url http url
     * @param object object
     * @return java.net.URI
     */
    private URI buildUri(String url, @Nullable Object object) {
        try {
            URI uri = new URIBuilder(url).build();
            if (ObjectUtils.isNotEmpty(object)) {
                List<NameValuePair> nameValuePairs = object2NameValuePairs(object);
                if (CollectionUtils.isNotEmpty(nameValuePairs)) {
                    uri = new URIBuilder(url).addParameters(nameValuePairs).setCharset(CharsetPool.UTF_8).build();
                }
            }

            return Optional.ofNullable(uri).orElse(new URIBuilder(url).build());
        } catch (Exception e) {
            log.error("build URI failed ", e);
        }
        return null;
    }


    /**
     * object2NameValuePairs object parse to name value
     *
     * @author fxbin
     * @since 2019/11/17 17:45
     * @param object object
     * @return java.util.List<org.apache.http.NameValuePair>
     */
    private List<NameValuePair> object2NameValuePairs(@Nullable Object object) {
        List<NameValuePair> nameValuePairs = new ArrayList<>();

        if (ObjectUtils.isEmpty(object)) {
            return nameValuePairs;
        }

        // java.util.Map
        if (object instanceof Map) {
            @SuppressWarnings("rawtypes") Map<?, ?> params = (Map) object;
            params.forEach((k, v) -> {
                log.info("請求參數, key:{}, value:{}", k, v);
                nameValuePairs.add(new BasicNameValuePair(String.valueOf(k), String.valueOf(v)));
            });
        }

        // com.alibaba.fastjson.JSONObject
        if (object instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) object;
            Set<String> keys = jsonObject.keySet();
            keys.forEach(key -> {
                log.info("請求參數, key:{}, value:{}", key, jsonObject.getString(key));
                nameValuePairs.add(new BasicNameValuePair(key, jsonObject.getString(key)));
            });
        }

        // else
        return nameValuePairs;
    }


    /**
     * getRequestConfig 獲取請求配置:連接超時,請求超時,自動重定向配置
     *
     * @author fxbin
     * @since 2019/11/17 17:19
     * @return org.apache.http.client.config.RequestConfig
     */
    private RequestConfig getRequestConfig(){
        // 連接超時,請求超時,自動重定向配置
        return RequestConfig.custom()
                .setCookieSpec(CookieSpecs.DEFAULT)
                .setExpectContinueEnabled(true)
                // 讀超時 30s
                .setSocketTimeout(30000)
                // 鏈接超時 10s
                .setConnectTimeout(10000)
                // 鏈接不夠用的等待時間 10s
                .setConnectionRequestTimeout(10000)
                // 允許自動重定向
                .setRedirectsEnabled(true)
                .build();
    }
}

Github 地址


如果問題,請聯繫博主說明,感謝閱讀

歡迎關注博主公衆號:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章