http get或post请求工具类(Java后端)

硅谷探秘者 1722 0 0

 http get或post请求工具类(Java后端)

package com.libawall.example.fileImage.controller;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
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.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.DnsResolver;
import org.apache.http.conn.HttpConnectionFactory;
import org.apache.http.conn.ManagedHttpClientConnection;
import org.apache.http.conn.routing.HttpRoute;
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.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *  http get/post请求工具类
 */
public class HttpGetPostUtil {

    private static Logger log = LoggerFactory.getLogger(HttpGetPostUtil.class);

    private static PoolingHttpClientConnectionManager poolConnManager = null;

    private static CloseableHttpClient httpClient =null;

    public static synchronized CloseableHttpClient getHttpClient(){
        if(null==httpClient){
            //注册访问协议相关的Socket工厂
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                    .register("http",PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", SSLConnectionSocketFactory.getSystemSocketFactory()).build();
            //HttpConnection工厂:皮遏制写请求/解析响应处理器
            HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory=new
                    ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE,
                    DefaultHttpResponseParserFactory.INSTANCE);
            //DNS解析器
            DnsResolver  dnsResolver=SystemDefaultDnsResolver.INSTANCE;
            //创建池化连接管理器
            poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry,connectionFactory,dnsResolver);
            //默认为Socket配置
            SocketConfig defaultSocketConfig=SocketConfig.custom().setTcpNoDelay(true).build();
            poolConnManager.setDefaultSocketConfig(defaultSocketConfig);

            // 设置整个连接池的最大连接数
            poolConnManager.setMaxTotal(1000);
            // 每个路由的默认最大连接,每个路由实际最大连接默认为DefaultMaxPerRoute控制,maxTotal是整个池子最大数
            // DefaultMaxPerRoute设置过小无法支持大并发(ConnectPoolTimeoutException: Timeout waiting for connect from pool) 路由是maxTotal的细分
            //每个路由最大连接数
            poolConnManager.setDefaultMaxPerRoute(1000);
            //在从连接池获取连接时,连接不活跃多长时间后需要一次验证,默认2S
            poolConnManager.setValidateAfterInactivity(5*1000);

            //默认请求配置
            RequestConfig requestConfig = RequestConfig.custom()
                    //设置连接超时时间
                    .setConnectTimeout(2*1000)
                    //设置等待数据超时时间
                    .setSocketTimeout(5*1000)
                    //设置从连接池获取连接的等待超时时间
                    .setConnectionRequestTimeout(2000)
                    .build();

            HttpClientBuilder httpClientBuilder = HttpClients.custom();
            httpClientBuilder.setConnectionManager(poolConnManager)
                    //设置连接池不是共享模式
                    .setConnectionManagerShared(false)
                    //定期回调空闲连接
                    .evictIdleConnections(60, TimeUnit.SECONDS)
                    //定期回收过期
                    .evictExpiredConnections()
                    //连接存活时间,如果不设置,根据长连接信息决定
                    .setConnectionTimeToLive(60, TimeUnit.SECONDS)
                    //设置默认请求配置
                    .setDefaultRequestConfig(requestConfig)
                    // 连接重试策略,是否能keepalive
                    .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
                    //长连接配置,即获取长连接生产多少时间
                    .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
                    //设置重试次数,默认是3次;当前是禁用
                    .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
            httpClient = httpClientBuilder.build();

            //JVM停止或重启时,关闭连接池释放连接
            Runtime.getRuntime().addShutdownHook(new Thread(){
                public void run(){
                    try{
                        httpClient.close();
                    }catch(IOException e){
                        log.info(e.getMessage());
                    }
                }
            });
        }
        return httpClient;
    }


    /**
     * 发送 GET 请求(HTTP),不带输入数据
     * @param url
     * @return
     */
    public static String doGet(String url) {
        return doGet(url, new HashMap<String, Object>());
    }

    /**
     * 发送 GET 请求(HTTP),K-V形式
     * @param url
     * @param params
     * @return
     */
    public static String doGet(String url, Map<String, Object> params) {
        long a=System.currentTimeMillis();
        String apiUrl = url;
        StringBuffer param = new StringBuffer();
        int i = 0;
        for (String key : params.keySet()) {
            if (i == 0) {
                param.append("?");
            } else {
                param.append("&");
            }
            param.append(key).append("=").append(params.get(key));
            i++;
        }
        apiUrl += param;
        String result = null;
        CloseableHttpClient httpClient = getHttpClient();
        CloseableHttpResponse response = null;
        HttpGet httpPost = null;
        try {
            httpPost = new HttpGet(apiUrl);
            response = httpClient.execute(httpPost);
            int status = response.getStatusLine().getStatusCode();

            if (status ==HttpStatus.SC_OK) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    result = EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            }else{
                //不推荐使用CloseableHttpResponse.close关闭连接,他将直接关闭Socket,导致长连接不能复用
                EntityUtils.consume(response.getEntity());
            }
            return result;
        } catch (IOException e) {
            try {
                if(null !=response )
                    EntityUtils.consume(response.getEntity());
            } catch (IOException e1) {
                log.error(e.getMessage(), e1);
            }
            log.error(e.getMessage(), e);
        }
        return result;
    }

    public static String doPost(String url) {
        return doPost(url, new HashMap<String, Object>());
    }

    /**
     * 发送 POST 请求(HTTP),K-V形式
     *
     * @param url
     *            接口URL
     * @param params
     *            参数map
     * @return
     */
    public static String doPost(String url, Map<String, Object> params) {
        long a=System.currentTimeMillis();
        String result = null;
        HttpPost httpPost = new HttpPost(url);
        CloseableHttpClient httpClient = getHttpClient();
        CloseableHttpResponse response = null;
        try {
            List<NameValuePair> pairList = new ArrayList<>(params.size());
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue().toString());
                pairList.add(pair);
            }
            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
            response = httpClient.execute(httpPost);
            int status = response.getStatusLine().getStatusCode();
            if (status ==HttpStatus.SC_OK) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    result = EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            }else{
                //不推荐使用CloseableHttpResponse.close关闭连接,他将直接关闭Socket,导致长连接不能复用
                EntityUtils.consume(response.getEntity());
            }

            StringBuilder logsb=new StringBuilder();
            return result;
        } catch (Exception e) {
            try {
                if(null !=response )
                    EntityUtils.consume(response.getEntity());
            } catch (IOException e1) {
                log.error(e.getMessage(), e1);
            }
            log.error(e.getMessage(), e);
        }
        return result;
    }

    /**
     * 参数Map格式化
     * @param map
     * @return
     */
    public static String getPlanText(Map<String, Object> map) {
        StringBuilder sb=new StringBuilder();
        for(Map.Entry<String, Object> entry :map.entrySet()){
            sb.append(entry.getKey()).
                    append("=").
                    append(entry.getValue())
                    .append("&");
        }
        if(sb.length()>0){
            sb.deleteCharAt(sb.length()-1);
        }
        return sb.toString();
    }
}

 


评论区
请写下您的评论...
暂无评论...
猜你喜欢
计算机网络基础 2430 1.区别(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)(2)post发送的数据更大(get有url长度限制)(3)post能发送更多的数据
计算机网络基础 2453 HTTP错误400400出错由于语法格式有误,服务器无法理解此。不作修改,客户程序就无法重复此HTTP错误401401.1未授权:登录失败此错误表明传输给服务器的证书与登录服务器所需的
框架 1514 *@date2018年12月23日下午8:13:51*@versionV1.0*@Description:TODO(辨别的设备型)*/publicclassDeviceTypes{ /*** *判断是否是pcw
rabbitmq 915 auth_backends.2=http#认证型auth_http.http_method=post#认证和授权地址,官方提供了SpringBoot示例auth_http.user_path=http
weblog 1549 java判断的浏览器型是否是ie浏览器importjavax.servlet.http.HttpServletRequest;/*** 浏览器型判断*@author硅谷探秘者(jia
工具 1094 继承自URLConnection,可用于向指定网站发送GETPOST。它在URLConnection的基础上提供了如下便捷的方法:intgetResponseCode();//获取服务器的响应
weblog 1609 javaMD5加密和和javascript加密该加密没有加盐java加密importjava.security.MessageDigest
工具 1489 java压缩zippackagecom.dzqc.yx.util;importjava.io.File;importjava.io.FileInputStream
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。