HttpClient详解(6大功能及使用流程实例)

HttpClient详解(6大功能及使用流程实例)-mikechen

HttpClient定义

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。

 

HttpClient作用

HTTP Client和浏览器有点像,都可以用来发送请求,接收服务端响应的数据,但它不是浏览器,没有用户界面,只通过其API用于传输和接受HTTP消息。

 

HttpClient功能

HttpClient的主要功能,包含如下:

  • 基于标准的java语言实现了Http1.0和Http1.1等;
  • 实现了所有 HTTP 的方法,比如:GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等;
  • 支持 HTTPS 协议;
  • 支持代理服务器,比如:Nginx等;
  • 支持自动跳转转向等;

 

HttpClient使用步骤

使用HttpClient发送请求接收响应很简单,一般需要如下六步即可:

第一步: 创建HttpClient对象

CloseableHttpClient HttpClient = HttpClientBuilder.create().build();

提示:推荐用CloseableHttpClient,HttpClient是历史遗留版本,官方推荐使用CloseableHttpClient

 

第二步:创建请求方法的实例,并指定请求URL。

如果需要发送GET请求,创建HttpGet对象。

HttpGet httpGet = new HttpGet("https://mikechen.cc");

如果需要发送POST请求,创建HttpPost对象。

HttpPost httppost = new HttpPost("https://mikechen.cc");

 

第三步:设置发送请求参数

如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数。

 

第四步:调用execute发送请求

HttpResponse response = HttpClient.execute(httpGet);

发送请求,该方法返回一个HttpResponse。

 

第五步:获取请求内容

调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。

//调用HttpResponse的getEntity()方法可获取HttpEntity对象            
HttpEntity resEntity = response.getEntity();

调用HttpResponse的getEntity()方法,程序可通过该对象获取服务器的响应内容。

 

第六步:释放连接

response.close();
HttpClient.close();

无论执行方法是否成功,都必须释放连接。

 

HttpClient使用实例

下面我们一起再看下完整的HttpClient使用实例。

1.添加HttpClient依赖

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/HttpClient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>HttpClient</artifactId>
            <version>5.2</version>
        </dependency>

 

2.发送GET请求

HttpClient发送GET请求的例子,如下所示:

public void doGetTestOne() {
        // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
        CloseableHttpClient HttpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpGet httpGet = new HttpGet("https://mikechen.cc/item/1/31661");
 
        // 响应模型
        CloseableHttpResponse response = null;
        try {
            // 由客户端执行(发送)Get请求
            response = HttpClient.execute(httpGet);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = response.getEntity();
            System.out.println("响应状态为:" + response.getStatusLine());
            if (responseEntity != null) {
                System.out.println("响应内容长度为:" + responseEntity.getContentLength());
                System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 释放资源
                if (HttpClient != null) {
                    HttpClient.close();
                }
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

GET请求的参数传递是通过URL拼接来实现的,所以,我们想发送带参数的Get请求,可直接拼接在ulr后。

 

3.发送POST请求

/*
* 封装HttpClient发送post请求的工具类
* */
public class HttpClientUtils {
   //私有化构造器,防止HttpClientUtils被创建对象
    private HttpClientUtils(){
    }
  static CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

    //HttpPost的请求执行
    public static String sendHttpPost(String url, JSONObject JsonValues) throws UnsupportedEncodingException {
        HttpClientUtils = HttpClientUtils.getHttpClientUtils();
        //获取HttpPost
        HttpPost httpPost = new HttpPost(url);
        //设置请求头
        httpPost.setHeader("x-appid", "test");
        httpPost.setHeader("x-client-version", "4.0.0");
        httpPost.setHeader("Content-Type","application/json");
        // 设置请求体
        StringEntity entity = new StringEntity(JsonValues.toString());
        httpPost.setEntity(entity);
        String content = null;
        try {
            CloseableHttpResponse responseTest = closeableHttpClient.execute(httpPost);
            if (responseTest.getStatusLine().getStatusCode() == 200) {
                // 获取响应实体
                HttpEntity resTestEntity = responseTest.getEntity();
                // 输出响应
                content = EntityUtils.toString(resTestEntity, "utf-8");
            }else {

                System.out.println("无效请求");
            }
            responseTest.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            closeableHttpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content;
    }
}

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法