HttpClient的基本使用

一、HttpClient的基本介绍

  1. Apache Jakarta Commons 下的 HttpClient 是一个开源的 Java HTTP 客户端库,用于发送 HTTP 请求和处理 HTTP 响应。它提供了一组简单易用的 API,使得与 Web 服务器进行通信变得简单而灵活。下面是 HttpClient 的基本介绍:

      1. 功能丰富:HttpClient 提供了丰富的功能和灵活的配置选项,可以满足各种不同的 HTTP 客户端需求。它支持 HTTP/1.1 和 HTTP/2 协议,支持 GET、POST、PUT、DELETE 等 HTTP 方法,支持重定向、代理服务器、身份认证等特性。
      1. 易用性:HttpClient 提供了简单易用的 API,使得发送 HTTP 请求和处理 HTTP 响应变得非常简单。开发人员可以轻松地创建 HttpClient 实例、构建 HTTP 请求、发送请求并处理响应。
      1. 性能优化:HttpClient 具有良好的性能和高效的资源管理机制。它支持连接池管理,可以重用已建立的连接,减少连接的创建和关闭开销,提高性能。此外,HttpClient 还支持异步请求和非阻塞 I/O 操作,可以更好地利用系统资源。
      1. 可定制性:HttpClient 允许开发人员对其行为进行灵活的定制和配置。你可以配置连接超时、读取超时、最大连接数、请求重试策略等参数,以满足特定的业务需求。
      1. 广泛应用:HttpClient 在 Java 开发领域广泛应用,被用于构建网络爬虫、编写 Web 服务客户端、进行自动化测试、与 RESTful API 进行交互等场景。
      1. 稳定性和可靠性:HttpClient 是一个成熟稳定的项目,经过了长期的开发和测试,拥有庞大的用户群体和活跃的社区支持。它的稳定性和可靠性得到了广泛验证,可以放心使用。
  2. 总之,Apache Jakarta Commons HttpClient 是一个功能强大、易用性高、性能优秀的 Java HTTP 客户端库,是 Java 开发中常用的工具之一。
    在这里插入图片描述

  3. HttpClient是Apache的一个子项目,是高效的、功能丰富的支持HTTP协议的客户端编程工具包
    在这里插入图片描述

  4. HttpClient的作用:

    • 发送 HTTP 请求
    • 接收 HTTP 响应的数据

二、HttpClient的基本使用

  1. 引入依赖
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version> <!-- 请根据你的需求选择合适的版本 -->
</dependency>

  1. 代码中的操作步骤:
      1. 创建 HttpClient 实例: 使用 DefaultHttpClient 或 CloseableHttpClient 类创建 HttpClient 实例。
      1. 构建 HTTP 请求: 使用 HttpGet、HttpPost 等类构建 HTTP 请求。你需要指定请求的 URL、请求头和请求体(如果需要的话)。
      1. 发送 HTTP 请求: 使用 HttpClient 实例执行 HTTP 请求,并接收 HttpResponse 对象。
      1. 处理 HTTP 响应: 可以从 HttpResponse 对象中获取响应的状态码、响应头和响应体等信息。
      1. 关闭 HttpClient: 使用完 HttpClient 后,需要关闭以释放资源。
package com.sky.test;


import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

//把注解注释起来,不然每次运行项目都会运行测试类
@SpringBootTest
public class HttpClientTest {

    /**
     * 测试通过httpclient发送GET方式的请求
     */
    @Test
    public void testGET() throws Exception{
        //创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建请求对象(参数填写一个可以访问的)
        HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");

        //发送请求,接受响应结果
        CloseableHttpResponse response = httpClient.execute(httpGet);

        //获取服务端返回的状态码
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("服务端返回的状态码为:" + statusCode);

        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity);
        System.out.println("服务端返回的数据为:" + body);

        //关闭资源
        response.close();
        httpClient.close();
    }


    /**
     * 测试通过httpclient发送POST方式的请求
     */
    @Test
    public void testPOST() throws Exception{
        // 创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建请求对象(参数填写一个可以访问的)
        HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");

//        设置请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username","admin");
        jsonObject.put("password","123456");

        StringEntity entity = new StringEntity(jsonObject.toString());
        //指定请求编码方式
        entity.setContentEncoding("utf-8");
        //指定数据格式
        entity.setContentType("application/json");
        httpPost.setEntity(entity);

        //发送请求
        CloseableHttpResponse response = httpClient.execute(httpPost);

        //解析返回结果
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("响应码为:" + statusCode);
        HttpEntity entity1 = response.getEntity();
        String body = EntityUtils.toString(entity1);
        System.out.println("响应数据为:" + body);

        //关闭资源
        response.close();
        httpClient.close();
    }
}


三、HttpClient的应用场景

  1. Apache Jakarta Commons 下的 HttpClient 是一个功能强大的 HTTP 客户端库,它可以用于许多不同的应用场景,包括但不限于:

      1. 网络爬虫和数据采集:HttpClient 提供了丰富的 API,可以方便地发送 HTTP 请求并处理响应。这使得它非常适合用于编写网络爬虫和数据采集工具,用于抓取网页内容、API 数据或其他网络资源。
      1. Web 服务客户端:HttpClient 可以用作 Web 服务的客户端,用于与 RESTful API、SOAP 服务或其他基于 HTTP 的服务进行通信。它可以发送 GET、POST、PUT、DELETE 等类型的请求,并处理服务端返回的数据。
      1. 自动化测试:HttpClient 可以在自动化测试中用来模拟客户端行为,发送请求并验证服务端返回的响应。这在进行 API 测试、集成测试或端到端测试时非常有用。
      1. 数据交换:HttpClient 可以用于与各种数据源进行交换数据,例如与远程数据库、文件服务器或其他 HTTP 服务进行数据交换。
      1. 代理服务器:HttpClient 支持代理服务器,可以通过代理服务器发送请求,并可以配置代理服务器的认证信息等。
      1. 身份验证:HttpClient 支持多种身份验证方式,包括基本认证、摘要认证、NTLM 认证等,可以用于与需要身份验证的服务进行通信。
      1. 文件上传和下载:HttpClient 可以用于上传文件到服务器或从服务器下载文件,支持发送 multipart/form-data 类型的请求。
      1. 长连接和连接池管理:HttpClient 支持 HTTP 1.1 的持久连接机制,可以重复使用已建立的连接,并提供连接池管理功能,以提高性能和减少资源消耗。
  2. 总之,Apache Jakarta Commons 下的 HttpClient 是一个功能丰富、灵活易用的 HTTP 客户端库,可以满足各种不同的网络通信需求,是 Java 开发中常用的工具之一。

在这里插入图片描述

三、1、 (案例)微信登录功能(通过HttpClient访问微信接口服务)

一般会封装成一个工具类使用:

/**
 * Http工具类
 */
public class HttpClientUtil {

    static final  int TIMEOUT_MSEC = 5 * 1000;

    /**
     * 发送GET方式请求
     * @param url
     * @param paramMap
     * @return
     */
    public static String doGet(String url,Map<String,String> paramMap){
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String result = "";
        CloseableHttpResponse response = null;

        try{
            URIBuilder builder = new URIBuilder(url);
            if(paramMap != null){
                for (String key : paramMap.keySet()) {
                    builder.addParameter(key,paramMap.get(key));
                }
            }
            URI uri = builder.build();

            //创建GET请求
            HttpGet httpGet = new HttpGet(uri);

            //发送请求
            response = httpClient.execute(httpGet);

            //判断响应状态
            if(response.getStatusLine().getStatusCode() == 200){
                result = EntityUtils.toString(response.getEntity(),"UTF-8");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                response.close();
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    /**
     * 发送POST方式请求
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);

            // 创建参数列表
            if (paramMap != null) {
                List<NameValuePair> paramList = new ArrayList();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }

            httpPost.setConfig(builderRequestConfig());

            // 执行http请求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }

    /**
     * 发送POST方式请求
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);

            if (paramMap != null) {
                //构造json格式数据
                JSONObject jsonObject = new JSONObject();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    jsonObject.put(param.getKey(),param.getValue());
                }
                StringEntity entity = new StringEntity(jsonObject.toString(),"utf-8");
                //设置请求编码
                entity.setContentEncoding("utf-8");
                //设置数据类型
                entity.setContentType("application/json");
                httpPost.setEntity(entity);
            }

            httpPost.setConfig(builderRequestConfig());

            // 执行http请求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }
    private static RequestConfig builderRequestConfig() {
        return RequestConfig.custom()
                .setConnectTimeout(TIMEOUT_MSEC)
                .setConnectionRequestTimeout(TIMEOUT_MSEC)
                .setSocketTimeout(TIMEOUT_MSEC).build();
    }

}

在这里插入图片描述

四、HttpClient的实现原理

  1. HttpClient 是 Apache 软件基金会提供的一个功能强大的 HTTP 客户端库,用于发送 HTTP 请求和处理 HTTP 响应。它的实现原理涉及到底层的网络通信、连接管理、请求处理等多个方面。

  2. HttpClient 的基本实现原理:

      1. 网络通信:HttpClient 使用 Java 标准库提供的网络通信 API(如 java.net.Socketjava.net.HttpURLConnection 等)进行 HTTP 请求的发送和响应的接收。它可以通过配置代理、设置连接超时、读取超时等参数来控制网络通信的行为。
      1. 连接管理:HttpClient 使用连接池来管理 HTTP 连接,以提高性能和降低资源消耗。连接池维护了一组可重用的连接对象,当需要发送 HTTP 请求时,可以从连接池中获取连接对象并重用,而不是每次都创建新的连接。连接池还可以根据连接的状态、空闲时间等因素来动态调整连接数量,以满足不同负载下的需求。
      1. 请求处理:HttpClient 提供了丰富的 API 来构建 HTTP 请求,包括设置请求方法、请求头、请求体等。它可以发送 GET、POST、PUT、DELETE 等各种类型的请求,并支持文件上传、表单提交、多部分请求等功能。HttpClient 还支持重定向、认证、Cookie 管理、SSL/TLS 安全等特性。
      1. 响应处理:HttpClient 可以解析 HTTP 响应并提取其中的状态码、响应头、响应体等信息。它支持解析各种类型的响应内容,包括文本、JSON、XML、字节流等。HttpClient 还提供了流式 API 来逐行读取响应内容,以便于处理大型响应或实时流数据。
      1. 线程安全性:HttpClient 是线程安全的,可以在多线程环境中安全地共享和重用。它使用了同步、锁机制等技术来确保在并发访问时的线程安全性。
  3. 总的来说,HttpClient 的实现原理基于底层的网络通信、连接管理、请求处理等机制,提供了一个高性能、高度可配置、易用的 HTTP 客户端库,适用于各种类型的 HTTP 请求和响应场景。

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值