java笔记----利用Apache HttpClient 发送http请求

1,087 阅读3分钟

HttpClient的主要功能

  • 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)

  • 支持自动转向

  • 支持 HTTPS 协议

  • 支持代理服务器等

HttpClient使用步骤

  1. 创建 HttpClient 对象
  2. 创建请求方法的实例,并指定请求 URL。如果需要发送 GET 请求,创建 HttpGet 对象;如果需要发送 POST 请求,创建 HttpPost 对象。
  3. 如果需要发送请求参数,可调用 HttpGetHttpPost 共同的 setParams(HttpParams params) 方法来添加请求参数;对于 HttpPost 对象而言,也可调用 setEntity(HttpEntity entity) 方法来设置请求参数
  4. 调用 HttpClient 对象的 execute(HttpUriRequest request) 发送请求,该方法返回一个 HttpResponse
  5. 调用 HttpResponsegetAllHeaders()getHeaders(String name) 等方法可获取服务器的响应头;调用 HttpResponsegetEntity() 方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容
  6. 释放连接。无论执行方法是否成功,都必须释放连接

[当前使用步骤转载地址](www.jianshu.com/p/97795bade…)

maven 引入依赖

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

封装httpGet请求

/**
 * GET 请求
 * 根据自己的需要 定义形参列表 返回值类型
 */
public static void doGet(){

    //创建HttpClient 客户端
    CloseableHttpClient httpClient = HttpClients.createDefault();

    //创建 httpGet请求  参数:请求的http地址
    HttpGet httpGet = new HttpGet("");
    //设置长连接  当前设置长连接的作用是 请求完服务器以后 连接通道保持不关闭 但是这段代码最后关闭了连接 所以在这里并没有什么用
    httpGet.setHeader("Connection","keep-alive");
    //设置请求头 模拟浏览器请求
    httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");

    //httpResponse对象  用于接受http请求的结果
    CloseableHttpResponse httpResponse = null;

    try {
        //执行http请求  并输出响应结果
        httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        System.out.println(EntityUtils.toString(httpEntity));
    } catch (IOException e) {
        e.printStackTrace();
    }

    //请求完毕以后 需要关闭连接 无论请求是否成功  都需要关闭连接
    finally {
        if(httpClient != null){
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (httpResponse != null){
            try {
                httpResponse.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

[本段代码出处](www.jianshu.com/p/97795bade…)

封装httpPost请求

/**
 * POST 请求
 * 形参列表和返回值类型自己封装就可以
 */
public static void doPost(){

    //创建httpClient客户端
    CloseableHttpClient httpClient = HttpClients.createDefault();

    //创建 HttpPost请求  参数:http地址
    HttpPost httpPost = new HttpPost("");

    //设置请求头  请求头可以设置很多 这里主要是设置了这两个

    // 设置代理(模拟浏览器版本)
    httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
    // 设置 Cookie
    httpPost.setHeader("Cookie", "UM_distinctid=16442706a09352-0376059833914f-3c604504-1fa400-16442706a0b345; CNZZDATA1262458286=1603637673-1530123020-%7C1530123020; JSESSIONID=805587506F1594AE02DC45845A7216A4");

    //HttpPost请求 要传的参数 这里先将参数封装起来
    List<BasicNameValuePair> params = new ArrayList<>();
    params.add(new BasicNameValuePair("userId","1"));
    params.add(new BasicNameValuePair("userName","王恒润"));
    params.add(new BasicNameValuePair("userEmail","1650987523@qq.com"));

    //httpResponse对象  用于接受http请求的结果
    CloseableHttpResponse httpResponse = null;


    try {

        //这一步才是 为post 请求设置参数  这是创建表单的实体对象 设置当前参数的编码格式
        httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));

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

        //获取返回数据
        HttpEntity httpEntity = httpResponse.getEntity();

    }catch (UnsupportedEncodingException e){
        e.printStackTrace();
    }catch (ClientProtocolException e){
        e.printStackTrace();
    }catch (IOException  e){
        e.printStackTrace();
    }

    //关闭连接 不管请求成功与否
    finally {
        if(httpClient != null){
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if(httpResponse != null){
            try {
                httpResponse.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

[本段代码出处](www.jianshu.com/p/97795bade…)

接下来 封装成实体类 设置返回值类型 随您所愿