写点什么

HttpClient 使用详解与实战一:普通的 GET 和 POST 请求

作者:乌龟哥哥
  • 2022 年 4 月 16 日
  • 本文字数:4221 字

    阅读完需:约 14 分钟

HttpClient使用详解与实战一:普通的GET和POST请求

简介

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 最新版本是 HttpClient 4.5.3 (GA)。官方下载:http://hc.apache.org/downloads.cgi

主要特性

  • 基于标准、纯净的 Java 语言,实现了 HTTP1.0 和 HTTP1.1。

  • 以可扩展的面向对象的结构实现了 HTTP 全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

  • 支持加密的 HTTPS 协议(HTTP 通过 SSL 协议)。

  • 通过 HTTP 代理方式建立透明的连接。

  • 利用 CONNECT 方法通过 HTTP 代理建立隧道的 HTTPS 连接。

  • Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 认证方案。

  • 插件式的自定义认证方案。

  • 可插拔的安全套接字工厂,使得接入第三方解决方案变得更容易

  • 连接管理支持使用多线程的的应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

  • 自动化处理 Set-Cookie:来自服务器的头,并在适当的时候将它们发送回 cookie。

  • 可以自定义 Cookie 策略的插件化机制。

  • Request 的输出流可以避免流中内容体直接从 socket 缓冲到服务器。

  • Response 的输入流可以有效的从 socket 服务器直接读取相应内容。

  • 在 HTTP1.0 和 HTTP1.1 中使用用 KeepAlive 来保持持久连接。

  • 可以直接获取服务器发送的响应码和响应头部。

  • 具备设置连接超时的能力。

  • 支持 HTTP/1.1 响应缓存。

  • 源代码基于 Apache License 可免费获取。

一般使用步骤

使用 HttpClient 发送请求、接收响应,一般需要以下步骤。HttpGet 请求响应的一般步骤:1). 创建HttpClient对象,可以使用HttpClients.createDefault();2). 如果是无参数的 GET 请求,则直接使用构造方法HttpGet(String url)创建HttpGet对象即可;如果是带参数 GET 请求,则可以先使用URIBuilder(String url)创建对象,再调用addParameter(String param, String value),或setParameter(String param, String value)来设置请求参数,并调用 build()方法构建一个 URI 对象。只有构造方法HttpGet(URI uri)来创建 HttpGet 对象。3). 创建HttpResponse,调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。调用HttpResponsegetAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponsegetEntity()方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()可以获取响应状态码。4). 释放连接。


HttpPost 请求响应的一般步骤:1). 创建HttpClient对象,可以使用HttpClients.createDefault();2). 如果是无参数的 GET 请求,则直接使用构造方法HttpPost(String url)创建HttpPost对象即可;如果是带参数 POST 请求,先构建 HttpEntity 对象并设置请求参数,然后调用 setEntity(HttpEntity entity)创建 HttpPost 对象。3). 创建HttpResponse,调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。调用HttpResponsegetAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponsegetEntity()方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()可以获取响应状态码。4). 释放连接。

实例代码实战

构建一个 Maven 项目,引入如下依赖


<dependency>     <groupId>org.apache.httpcomponents</groupId>     <artifactId>httpclient</artifactId>     <version>4.3.5</version></dependency><dependency>     <groupId>org.slf4j</groupId>     <artifactId>slf4j-log4j12</artifactId>     <version>1.7.10</version></dependency><dependency>   <groupId>org.apache.commons</groupId>   <artifactId>commons-io</artifactId>   <version>1.3.2</version></dependency>
复制代码

实例 1:普通的无参数 GET 请求

打开一个 url,抓取响应结果输出成 html 文件


/** *普通的GET请求 */public class DoGET {    public static void main(String[] args) throws Exception {        // 创建Httpclient对象        CloseableHttpClient httpclient = HttpClients.createDefault();        // 创建http GET请求        HttpGet httpGet = new HttpGet("http://www.baidu.com");        CloseableHttpResponse response = null;        try {            // 执行请求            response = httpclient.execute(httpGet);            // 判断返回状态是否为200            if (response.getStatusLine().getStatusCode() == 200) {                //请求体内容                String content = EntityUtils.toString(response.getEntity(), "UTF-8");                //内容写入文件                FileUtils.writeStringToFile(new File("E:\\devtest\\baidu.html"), content, "UTF-8");                System.out.println("内容长度:"+content.length());            }        } finally {            if (response != null) {                response.close();            }            //相当于关闭浏览器            httpclient.close();        }    }}
复制代码

实例 2:执行带参数的 GET 请求

模拟使用百度搜索关键字”java”,并保存搜索结果为 html 文件


/** * 带参数的GET请求 * 两种方式: *       1.直接将参数拼接到url后面 如:?wd=java *       2.使用URI的方法设置参数 setParameter("wd", "java") */public class DoGETParam {    public static void main(String[] args) throws Exception {        // 创建Httpclient对象        CloseableHttpClient httpclient = HttpClients.createDefault();        // 定义请求的参数        URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();        // 创建http GET请求        HttpGet httpGet = new HttpGet(uri);        //response 对象        CloseableHttpResponse response = null;        try {            // 执行http get请求            response = httpclient.execute(httpGet);            // 判断返回状态是否为200            if (response.getStatusLine().getStatusCode() == 200) {                String content = EntityUtils.toString(response.getEntity(), "UTF-8");                //内容写入文件                FileUtils.writeStringToFile(new File("E:\\devtest\\baidu-param.html"), content, "UTF-8");                System.out.println("内容长度:"+content.length());            }        } finally {            if (response != null) {                response.close();            }            httpclient.close();        }    }}
复制代码

实例 3:执行普通的 POST 请求

无参数的 POST 请求,并设置 Header 来伪装浏览器请求


/** * 常规post请求 *    可以设置Header来伪装浏览器请求 */public class DoPOST {    public static void main(String[] args) throws Exception {        // 创建Httpclient对象        CloseableHttpClient httpclient = HttpClients.createDefault();        // 创建http POST请求        HttpPost httpPost = new HttpPost("http://www.oschina.net/");        //伪装浏览器请求        httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");        CloseableHttpResponse response = null;        try {            // 执行请求            response = httpclient.execute(httpPost);            // 判断返回状态是否为200            if (response.getStatusLine().getStatusCode() == 200) {                String content = EntityUtils.toString(response.getEntity(), "UTF-8");                //内容写入文件                FileUtils.writeStringToFile(new File("E:\\devtest\\oschina.html"), content, "UTF-8");                System.out.println("内容长度:"+content.length());            }        } finally {            if (response != null) {                response.close();            }            httpclient.close();        }    }}
复制代码

实例 4:执行带参数的 POST 请求

模拟开源中国检索 java,并伪装浏览器请求,输出响应结果为 html 文件



/** * 带参数的GET请求 * 两种方式: *       1.直接将参数拼接到url后面 如:?wd=java *       2.使用URI的方法设置参数 setParameter("wd", "java") */public class DoGETParam {    public static void main(String[] args) throws Exception {        // 创建Httpclient对象        CloseableHttpClient httpclient = HttpClients.createDefault();        // 定义请求的参数        URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();        // 创建http GET请求        HttpGet httpGet = new HttpGet(uri);        //response 对象        CloseableHttpResponse response = null;        try {            // 执行http get请求            response = httpclient.execute(httpGet);            // 判断返回状态是否为200            if (response.getStatusLine().getStatusCode() == 200) {                String content = EntityUtils.toString(response.getEntity(), "UTF-8");                //内容写入文件                FileUtils.writeStringToFile(new File("E:\\devtest\\baidu-param.html"), content, "UTF-8");                System.out.println("内容长度:"+content.length());            }        } finally {            if (response != null) {                response.close();            }            httpclient.close();        }    }}
复制代码

总结

本文介绍了 HttpClient 的特性,是按照官方英文文档翻译而来,然后分别介绍了 HttpGet 和 HttpPost 的一般使用步骤,最后给出了 4 个简单的实例的 Java 代码。

用户头像

乌龟哥哥

关注

正在努力寻找offer的大四小菜鸟 2021.03.16 加入

擅长 Hbuilder、VS Code、MyEclipse、AppServ、PS 等软件的安装与卸载 精通 Html、CSS、JavaScript、jQuery、Java 等单词的拼写 熟悉 Windows、Linux、 等系统的开关机 看–时间过得多快,不说了,去搬砖了

评论

发布
暂无评论
HttpClient使用详解与实战一:普通的GET和POST请求_4月月更_乌龟哥哥_InfoQ写作平台