HttpClient 发送请求的Java工具类utils

SpringBoot整合HttpClient 发送get/post请求的Java工具类utils(详细注释以及原理解析)

最近项目需要springboot整合发送http请求的功能,在网上找了不少的教程不是很详细,有的不是很完善,其中一个挺不错的教程,在此总结一下代码和相关的原理,方便我日后继续学习总结。


食用方法:1、先导包
2、三个方法复制粘贴到工具类即可完成,
ps:我做了异常的验证,非空校验(异常换成自己项目一致的就行,或者直接删了),我做了详细的注释和原理解析,可以自行学习,欢迎批评指正。


写在开头:大部分的java项目都离不开http通信,发送get/post请求等,一个完整的工具类是java 项目必不可少的一部分,大部分公司和个人都有自己的工具类,但是都是已经封装好了,不利于我们的学习和整理,于是我也想自己封装自己的工具类,就有了这篇帖子,记录自己的成长历程。


1、导包

		<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>

2、Java发送get请求(包含请求参数param 和请求头head–参数均可不传,写null即可)

/**
     * 发起HTTP GET请求方法。
     *
     * @param url        请求的URL地址。
     * @param params     请求的参数,以Map的形式提供,其中key是参数名称,value是参数值。
     * @param headParams 请求的头部参数,以Map的形式提供,其中key是头部名称,value是头部值。
     * @return           返回HTTP请求的响应结果字符串。
     * @throws BusinessException 当URL为空时抛出,表示参数错误。
     */
    public static String doHttpGet(String url, Map<String, String> params, Map<String, String> headParams) {
        if (url == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "url为空");
        }
        String result = null;
        // 创建HTTP客户端
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 用于存放接口返回结果
        CloseableHttpResponse response = null;
        String paramStr = null;
        try {
            // 构建请求参数列表
            List<BasicNameValuePair> paramsList = new ArrayList<>();
            if (params != null) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    paramsList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
                // 将参数列表转换为字符串形式,用于拼接到URL后
                paramStr = EntityUtils.toString(new UrlEncodedFormEntity(paramsList));
            }

            // 拼接参数到URL
            StringBuffer sb = new StringBuffer();
            sb.append(url);
            if (paramStr != null && !paramStr.isEmpty()) {
                sb.append("?");
                sb.append(paramStr);
            }

            // 创建HTTP GET请求
            HttpGet httpGet = new HttpGet(sb.toString());
            // 设置请求和传输超时时间
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
            httpGet.setConfig(requestConfig);

            // 添加请求头信息
            if (headParams != null) {
                for (Map.Entry<String, String> entry : headParams.entrySet()) {
                    httpGet.addHeader(entry.getKey(), entry.getValue());
                }
            }

            // 执行请求并获取响应
            response = httpClient.execute(httpGet);
            // 获取响应状态码
            int statusCode = response.getStatusLine().getStatusCode();
            // 判断响应状态码是否为200(OK)
            if (HttpStatus.SC_OK != statusCode) {
                // 如果不是200,终止请求并抛出异常
                httpGet.abort();
                throw new RuntimeException("HttpClient, error status code: " + statusCode);
            }
            // 将响应内容转换为字符串
            HttpEntity entity = response.getEntity();
            if (null != entity) {
                result = EntityUtils.toString(entity);
            }
            // 关闭实体资源
            EntityUtils.consume(entity);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭所有资源连接
            if (null != response) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // 返回结果
        return result;
    }
2.1代码解析:
//原理解析:doHttpGet 方法
doHttpGet 方法是一个用于发起 HTTP GET 请求的工具方法,主要用于向指定的URL发送请求并获取响应。以下是其工作原理的详细解析:

1. 参数检查和初始化
参数检查:首先检查传入的 url 是否为 null。如果是 null,则抛出 BusinessException,指明参数错误。这是一种防御性编程策略,确保方法不会在无效的输入上继续执行。
初始化变量:定义了用于存储结果的 String result 变量和用于HTTP通信的 CloseableHttpClientCloseableHttpResponse 对象。
2. 构建请求参数
参数转换:如果提供了 params(请求参数),则遍历这些参数,将它们转换成 BasicNameValuePair 对象,并添加到 paramsList 中。BasicNameValuePair 是一个简单的键值对实体,用于存储参数。
URL编码:通过 EntityUtils.toString(new UrlEncodedFormEntity(paramsList)) 对参数进行URL编码。这保证了参数在HTTP请求中的正确格式。
3. 拼接完整的URL
URL构建:使用 StringBuffer 将原始URL和编码后的参数字符串拼接起来,如果存在参数,它们将以查询字符串的形式附加到URL后面。
4. 创建和配置HTTP GET请求
创建GET请求:使用拼接好的URL创建一个 HttpGet 对象。
设置请求配置:配置请求的超时设置,如连接超时和数据传输超时。
5. 设置请求头
添加头部参数:如果提供了 headParams(请求头参数),则遍历这些参数,并将它们作为头部信息添加到HTTP GET请求中。
6. 发起请求并处理响应
发送请求:使用 httpClient.execute(httpGet) 发送请求并获取响应。
检查响应状态码:检查响应的状态码是否为200OK)。如果不是200,终止请求并抛出异常。
处理响应实体:如果响应实体(HttpEntity)非空,则将其内容转换为字符串格式的结果。
7. 资源清理
关闭资源:无论请求成功还是异常,最后都要关闭响应和HTTP客户端资源,以避免潜在的资源泄露。
8. 返回结果
返回响应数据:返回从响应实体中获取的字符串结果。
总结
doHttpGet 方法封装了HTTP GET请求的完整流程:从初始化、构建请求、发送请求、到处理响应和清理资源。它通过简化HTTP请求的复杂性,使得在代码中发起GET请求更加直观和易于管理。

3、Java发送 POST请求(使用表单数据提交,不用表单可以用另外一个)


    /**
     * 发送HTTP POST请求(使用表单数据)。
     * 该方法用于通过POST方式发送表单数据到指定的URL,并返回响应结果。
     *
     * @param url        请求的URL地址。不能为空。
     * @param params     请求的参数,以键值对形式提供。可以为空,但如果非空,则以表单数据形式发送。
     * @param headParams 请求的头部参数,以键值对形式提供。可以为空,但如果非空,则添加到请求头中。
     * @return           服务器响应的字符串形式内容。如果请求失败,则可能返回null。
     * @throws BusinessException 当发生不支持的编码、客户端协议错误或IO异常时抛出。
     */
    public static String doPostFormData(String url, Map<String, String> params, Map<String, String> headParams) {
        String result = null;
        // 创建HTTP客户端实例
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;

        try {
            // 创建HTTP POST请求对象
            HttpPost httpPost = new HttpPost(url);

            // 配置请求和传输超时时间
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build();
            httpPost.setConfig(requestConfig);

            // 如果存在请求参数,则将其转换为表单实体,并设置到请求对象中
            if (params != null && !params.isEmpty()) {
                List<NameValuePair> paramsList = new ArrayList<>();
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    paramsList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
                UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(paramsList, "UTF-8");
                httpPost.setEntity(urlEncodedFormEntity);
            }

            // 如果存在头部参数,则添加到请求头中
            if (headParams != null && !headParams.isEmpty()) {
                for (Map.Entry<String, String> entry : headParams.entrySet()) {
                    httpPost.addHeader(entry.getKey(), entry.getValue());
                }
            }

            // 执行请求并获取响应
            response = httpClient.execute(httpPost);

            // 检查响应状态码
            int statusCode = response.getStatusLine().getStatusCode();
            if (HttpStatus.SC_OK != statusCode) {
                httpPost.abort();
                throw new RuntimeException("HttpClient,error status code :" + statusCode);
            }

            // 从响应中获取内容并转换为字符串
            HttpEntity entity = response.getEntity();
            if (null != entity) {
                result = EntityUtils.toString(entity, "UTF-8");
            }
            EntityUtils.consume(entity);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 无论成功或失败,都关闭资源
            HttpClientUtils.closeQuietly(response);
            HttpClientUtils.closeQuietly(httpClient);
        }
        return result;
    }
3.1原理解析:
//原理解析
doPostFormData 方法的原理可以分为几个步骤:

创建 HTTP 客户端:方法首先创建一个 CloseableHttpClient 实例,用于执行 HTTP 请求。

构建 POST 请求:使用 HttpPost 类来构建一个 POST 请求,指定要请求的 URL。

设置请求参数:如果提供了 params 参数(键值对形式),则将它们转换为 UrlEncodedFormEntity 对象。这个对象用于将键值对转换为适用于 HTTP 传输的格式(即 application/x-www-form-urlencoded)。

设置请求头:如果提供了 headParams,则遍历它们并将每一对键值添加到请求的头部。

执行请求并获取响应:使用 httpClient.execute(httpPost) 方法发送请求并接收响应。

处理响应:检查响应状态码。如果状态码是 200,则从响应中提取内容并转换为字符串。否则,抛出异常。

资源清理:无论请求成功还是失败

4、Java发送 POST请求(json格式)

/**
 * 发送HTTP POST请求,参数为JSON格式。
 * 此方法用于将JSON格式的字符串作为请求体发送到指定的URL,并接收响应。
 *
 * @param url        请求的URL地址。不能为空。
 * @param params     请求的参数,应为符合JSON格式的字符串。
 * @param headParams 请求的头部参数,以键值对形式提供。可以为空,但如果非空,则添加到请求头中。
 * @return           服务器响应的字符串形式内容。如果请求失败,则可能返回null。
 * @throws BusinessException 当发生不支持的编码、客户端协议错误或IO异常时抛出。
 */
public static String doPostJson(String url, String params, Map<String, String> headParams) {
    String result = null;
    // 创建HTTP客户端实例
    CloseableHttpClient httpClient = HttpClients.createDefault();
    CloseableHttpResponse response = null;

    try {
        // 创建HTTP POST请求对象
        HttpPost httpPost = new HttpPost(url);

        // 配置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build();
        httpPost.setConfig(requestConfig);

        // 将JSON字符串参数转换为StringEntity,并设置请求实体
        httpPost.setEntity(new StringEntity(params, ContentType.create("application/json", "UTF-8")));

        // 如果存在头部参数,则添加到请求头中
        if (headParams != null && !headParams.isEmpty()) {
            for (Map.Entry<String, String> entry : headParams.entrySet()) {
                httpPost.addHeader(entry.getKey(), entry.getValue());
            }
        }

        // 执行请求并获取响应
        response = httpClient.execute(httpPost);

        // 检查响应状态码
        int statusCode = response.getStatusLine().getStatusCode();
        if (HttpStatus.SC_OK != statusCode) {
            httpPost.abort();
            throw new RuntimeException("HttpClient,error status code :" + statusCode);
        }

        // 从响应中获取内容并转换为字符串
        HttpEntity entity = response.getEntity();
        if (null != entity) {
            result = EntityUtils.toString(entity, "UTF-8");
        }
        EntityUtils.consume(entity);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 无论成功或失败,都关闭资源
        HttpClientUtils.closeQuietly(response);
        HttpClientUtils.closeQuietly(httpClient);
    }
    return result;
}

4.1原理解析:
//原理解析:doPostJson 方法
doPostJson 方法是一个用于发起 HTTP POST 请求并发送 JSON 格式数据的工具方法。以下是其工作原理的详细解析:

1. HTTP客户端的创建与配置
创建HTTP客户端:方法首先创建一个 CloseableHttpClient 实例,这是执行 HTTP 请求的主体。
构建POST请求:使用 HttpPost 类实例化一个 POST 请求,指定目标URL。
设置超时时间:通过 RequestConfig 设置连接超时和传输超时时间,确保请求在规定时间内完成。
2. 设置请求体为JSON数据
JSON数据准备:方法接收一个JSON格式的字符串作为参数。
转换为请求实体:这个JSON字符串被转换为 StringEntity,同时指定其内容类型为 application/json 和字符集为 UTF-8。这告诉HTTP客户端和服务器,发送的数据是JSON格式的。
3. 添加请求头
设置请求头:如果提供了 headParams(请求头参数),则遍历这些参数,将每个键值对添加到POST请求的头部。这对于设置如认证信息、内容类型等HTTP头部是必要的。
4. 发送请求并处理响应
执行请求:使用 httpClient.execute(httpPost) 发送包含JSON数据的POST请求,并接收响应。
检查响应状态:检查响应的HTTP状态码。通常,状态码 200 OK 表示请求成功处理。
异常处理:如果状态码不是200,则终止请求并抛出运行时异常,说明请求未成功。
5. 提取响应数据
解析响应实体:如果响应实体(HttpEntity)非空,则从中提取内容,并将其转换为UTF-8编码的字符串。这通常是服务器的响应数据。
6. 资源清理
关闭资源:最后,无论请求成功还是出现异常,方法都会关闭响应和HTTP客户端,以释放网络资源和连接。
7. 返回结果
返回数据:方法返回从服务器接收的响应字符串,或者在出现错误时返回 null。
总结
doPostJson 方法通过封装 Apache HttpClient 的功能,提供了一个简单的方式来发送带有JSON数据的POST请求。它处理了从设置请求参数和头部,到执行请求和处理响应的整个流程,使得在Java应用中发送和接收JSON数据变得简单高效。

原作者是码龄六年的大佬:苍煜 原文链接如下:

https://blog.csdn.net/qq_41694906/article/details/126748497?ops_request_misc=&request_id=&biz_id=102&utm_term=httpclient%20java%E5%B7%A5%E5%85%B7%E7%B1%BB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-126748497.142^v96^pc_search_result_base4&spm=1018.2226.3001.4187

5、写在最后

这是我java 项目目前使用的发送http的工具类,涵盖了主要的get请求和post请求,
好处就是参数均可以选择传和不传,有异常处理,有非空校验,同时也有详细的
注释原理解析,接下来我会写一个关于使用微信小程序登录的接口和用户授权获
取用户手机号的接口,完全根据微信开发者文档开发。感兴趣的可以关注,另外
最近也会发布一些ChatGPT的思考,使用了很久了,感悟很深。
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值