
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
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。