JAVA http请求 GET/POST 工具

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.Charsets;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
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.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.UUID;


/**
 * @ClassName : HttpClientPool
 * @Description : http请求工具
 * @Author : liming mu
 * @Data : 2022/11/8 12:05
 * @Version : 1.0.0
 **/
public class HttpClientPool implements InitializingBean {
    Logger logger = LoggerFactory.getLogger(HttpClientPool.class);
    private PoolingHttpClientConnectionManager poolConnManager;
    private RequestConfig requestConfig;
    private CloseableHttpClient httpClient;
    @Value("${HTTP_SECRET_KEY:}")
    public String HTTP_SECRET_KEY;
    @Value("${HTTP_APP_KEY:}")
    public String HTTP_APP_KEY;

    private void config(HttpRequestBase httpRequestBase, String requestData) {
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(100000)
                .setConnectTimeout(100000)
                .setSocketTimeout(100000).build();
        httpRequestBase.addHeader("Content-Type", "application/json;charset=UTF-8");
        if (!StringUtils.isAnyBlank(HTTP_SECRET_KEY, HTTP_APP_KEY)) {
            String timestamp = System.currentTimeMillis() + "";
            String nonce = UUID.randomUUID().toString();
            String ENCODING = "ascii";
            String ALGORITHM = "HmacSHA1";
            String signature = null;
            try {
                Mac mac = Mac.getInstance(ALGORITHM);
                mac.init(new SecretKeySpec(HTTP_SECRET_KEY.getBytes(ENCODING), ALGORITHM));
                String[] array = new String[]{
                        new String(timestamp.getBytes(ENCODING)),
                        new String(nonce.getBytes(ENCODING)),
                        new String(HTTP_APP_KEY.getBytes(ENCODING)),
                        new String(httpRequestBase.getURI().getPath().getBytes(ENCODING)),
                        new String(requestData.getBytes(ENCODING)),
                        "",
                };
                String text = String.join("\n", array);
                byte[] signData = mac.doFinal(text.getBytes());
                byte[] bytes = Base64.encodeBase64(signData);
                signature = new String(Base64.encodeBase64(signData), ENCODING);
            } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            httpRequestBase.setHeader("TIMESTAMP", timestamp);
            httpRequestBase.setHeader("NONCE", nonce);
            httpRequestBase.setHeader("APP_KEY", HTTP_APP_KEY);
            httpRequestBase.setHeader("SIGNATURE", signature);
        }
        httpRequestBase.setConfig(requestConfig);
    }

    private void initPool() {
        try {
            SSLContextBuilder builder = new SSLContextBuilder();
            builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register(
                    "http", PlainConnectionSocketFactory.getSocketFactory()).register(
                    "https", sslsf).build();
            poolConnManager = new PoolingHttpClientConnectionManager(
                    socketFactoryRegistry);
            poolConnManager.setMaxTotal(1000);
            poolConnManager.setDefaultMaxPerRoute(1000);

            int socketTimeout = 100000;
            int connectTimeout = 100000;
            int connectionRequestTimeout = 100000;
            requestConfig = RequestConfig.custom().setConnectionRequestTimeout(
                    connectionRequestTimeout).setSocketTimeout(socketTimeout).setConnectTimeout(
                    connectTimeout).build();
            httpClient = getConnection();
        } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
            e.printStackTrace();
        }
    }

    private CloseableHttpClient getConnection() {
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(poolConnManager)
                .setDefaultRequestConfig(requestConfig)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
                .build();
        return httpClient;
    }

    public String post(String url, Map<String, Object> requestData) {
        HttpPost httpPost = new HttpPost(url);
        config(httpPost, requestData.toString());
        StringEntity stringEntity = new StringEntity(JSON.toJSONString(requestData), "UTF-8");
        stringEntity.setContentEncoding(Charsets.UTF_8.toString());
        httpPost.setEntity(stringEntity);
        return getResponse(httpPost);
    }

    public String post(String url, String requestData) {
        HttpPost httpPost = new HttpPost(url);
        config(httpPost, requestData);
        /*if(url.contains("/api/host") || url.contains("/api/guest")){
            httpPost.addHeader("request_token", request_token);
        }*/
        StringEntity stringEntity = new StringEntity(requestData, Charsets.UTF_8.toString());
        stringEntity.setContentEncoding("UTF-8");
        httpPost.setEntity(stringEntity);
        String result = getResponse(httpPost);
        logger.info("httpclient sent url {} request {} result: {}", url, requestData, result);
        return result;
    }


    /**
     *@Author: liming Mu
     *@Date: Created in 18:41 2022/3/10
     *@Description: 发送json请求给远端
     *@Params:
     @param url:
     @param paras:
     *@Returns: java.lang.String
     *@Modified By: None
     *@Version: 1.0.0
     */
    public String post(String url, JSONObject paras){
        HttpPost httpPost = new HttpPost(url);
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.addHeader("Authorization", "Basic YWRtaW46");
     /*   if(url.contains("/api/host") || url.contains("/api/guest")){
            httpPost.addHeader("request_token", request_token);
        }*/
        StringEntity s = new StringEntity(paras.toString(), "utf-8");
        s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
                "application/json"));
        httpPost.setEntity(s);
        logger.info("httpclient sent url {}", url);
        return getResponse(httpPost);
    }

    public String get(String url) {
        HttpGet httpGet = new HttpGet(url);
        config(httpGet, null);
        httpGet.addHeader("Authorization", "xxx"); //如果有认证需求
        return getResponse(httpGet);
    }


    private String getResponse(HttpRequestBase request) {
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(request,
                    HttpClientContext.create());
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity, Charsets.UTF_8);
            EntityUtils.consume(entity);
            return result;
        } catch (IOException e) {
            logger.error("send http error", e);
            return "request_fail";
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        initPool();
    }

    public static void main(String[] args) {
        HttpClientPool httpClientPool = new HttpClientPool();
        httpClientPool.initPool();
        String s = httpClientPool.get("http://xxx");
        System.out.println(s);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值