文章目录

  • HttpClient Java客户端
    • 建立使用HttpClient的环境
    • HttpGet请求
    • HttpGet带参请求
    • HttpPost请求
    • HttpPost带参请求(提交表单数据)
    • HttpClient连接池+请求配置

HttpClient Java客户端

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

HttpClient主要功能:

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

  2. 支持自动转向

  3. 支持 HTTPS 协议

  4. 支持代理服务器等

    (以上资料来自百度百科)

建立使用HttpClient的环境

如果创建的是maven项目的话可以导入依赖:

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

如果创建的是JavaWeb项目的话可以直接引入Jar包:httpclient-4.5.2.jar

想要其他版本的HttpClient工具的话可以搜索maven HttpClient下载。

这样就可以使用HttpClient来请求浏览器了。

HttpClient请求的步骤大致分为几步(类似人操作浏览器的步骤):

  1. 创建HttpClient的连接(打开浏览器建立与浏览器的连接)
  2. 创建请求,输入URI地址向浏览器发起请求(手动输入URI地址)
  3. HttpClient请求URI地址(浏览器中按回车发起请求)
  4. 拿到response响应数据(浏览器接收数据,解析渲染到页面)

以上就完成了从请求到接收数据的一个过程。下面看一下简单实现。

HttpGet请求

以GET请求的方式向百度贴吧发送一个请求:

//HttpClient发送GET请求
public class HttpGetRequest {public static void main(String[] args) {//百度贴吧的uri地址String uri = "https://tieba.baidu.com/index.html";//1、创建HttpClient连接CloseableHttpClient httpClient = HttpClients.createDefault();//2、创建HtpGet请求HttpGet httpGet = new HttpGet(uri);//3、HttpClient发送请求CloseableHttpResponse response = null;try {response = httpClient.execute(httpGet);//4、拿到请求页面的返回数据,请求成功才有数据啊!HttpEntity entity = null;if (response != null && response.getStatusLine().getStatusCode() == 200) {//获取服务器返回的实体数据entity = response.getEntity();//把实体数据转换成指定类型的字符串String context = EntityUtils.toString(entity, "utf-8");System.out.println(context);}} catch (IOException e) {e.printStackTrace();//发送请求异常} finally {//不管如何关闭响应、请求的连接if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}}if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}}
}

返回数据的部分截图:

HttpGet带参请求

在返回的这部分数据中找到一个请求地址发送一个带参数的GET请求,就以请求乘风破浪的姐姐为例:

//HttpClient发送带参数的GET请求
public class HttpGetRequestParam {public static void main(String[] args) {//百度贴吧的uri地址String uri = "https://tieba.baidu.com/f";  // --> /f:就是二级地址:注意地址一定要正确哦!一不小心就会404//1、创建HttpClient连接CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;try {//1.5、封装GET请求的参数URIBuilder uriBuilder = new URIBuilder(uri);//第一种:setParameter放参数uriBuilder.setParameter("kw", "乘风破浪的姐姐");//uriBuilder.setParameter("kw","乘风破浪的姐姐").setParameter("t","其他参数");//第二种:放参数//List<NameValuePair> params = new ArrayList<>();//params.add(new BasicNameValuePair("kw", "乘风破浪的姐姐"));//params.add(new BasicNameValuePair("t", "其他"));//uriBuilder.setParameters(params);//第三种:放参数//uriBuilder.setParameters(new BasicNameValuePair("kw", "乘风破浪的姐姐"),//        new BasicNameValuePair("t", "其他参数"));//2、创建HtpGet请求:uriBuilder.build()HttpGet httpGet = new HttpGet(uriBuilder.build());//3、HttpClient发送请求response = httpClient.execute(httpGet);//4、拿到请求页面的返回数据,请求成功才有数据啊!HttpEntity entity = null;if (response != null && response.getStatusLine().getStatusCode() == 200) {//获取服务器返回的实体数据entity = response.getEntity();//把实体数据转换成指定类型的字符串String context = EntityUtils.toString(entity, "utf8");System.out.println(context);}} catch (URISyntaxException | IOException e) {e.printStackTrace();} finally {//不管如何关闭响应、请求的连接if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}}if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}}
}

拿到的响应数据部分截图:

HttpPost请求

同HttpGet请求一样,请求百度贴吧的地址,细看之下,POST请求和GET请求是一样地。

//HttpClient发送POST请求
public class HttpPostRequest {public static void main(String[] args) {String uri = "https://tieba.baidu.com";//1、创建客户端,建立连接CloseableHttpClient httpClient = HttpClients.createDefault();//2、创建POST请求HttpPost httpPost = new HttpPost(uri);CloseableHttpResponse response = null;try {//3、发送请求response = httpClient.execute(httpPost);//4、获取响应数据if (response != null && response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();String context = EntityUtils.toString(entity, "utf-8");System.out.println(context);}} catch (IOException e) {e.printStackTrace();} finally {//不管如何关闭响应、请求的连接if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}}if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}}
}

返回数据部分截图:

HttpPost带参请求(提交表单数据)

POST请求一般用来提交表单数据,下面就是 POST带参请求的示例,同样以和HttpGet带参请求相同的地址乘风破浪的姐姐为例:

//由于篇幅的原因,异常不捕捉,直接抛出去了
//HttpClient发送带参POST请求
public class HttpPostRequestParam {public static void main(String[] args) throws IOException {String uri = "https://tieba.baidu.com/f";//1、创建客户端,建立连接CloseableHttpClient httpClient = HttpClients.createDefault();//1.5、封装表单参数//********************************************List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("kw", "乘风破浪的姐姐"));UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params);//2、创建HttpPost请求HttpPost httpPost = new HttpPost(uri);//设置表单参数到请求体httpPost.setEntity(formEntity);//********************************************//3、发送数据CloseableHttpResponse response = httpClient.execute(httpPost);if (response != null && response.getStatusLine().getStatusCode() == 200) {//4、获取数据HttpEntity entity = response.getEntity();String context = EntityUtils.toString(entity, "utf-8");System.out.println(context);}//关闭资源if (response != null) {response.close();}if (httpClient != null) {httpClient.close();}}
}

获取到返回的数据:

仔细对比之下,HttpGet请求和HttpPost请求除了参数的封装方式不一样之外其他的全部都是相同的。

HttpClient连接池+请求配置

httpClient连接池就类似于数据库连接池一样,从一个池子里里面获取连接。
从上面的示例可以看出,每一个代码后面都有一个finally代码块中的代码去关闭资源,而频繁的创建、关闭资源对性能的影响是很大的(就相当于每次打开浏览器,再关闭),所以在这里有了HttpClient连接池的概念。

连接池准备好HttpClient(先打开一定数量的浏览器)每次请求从连接池中获取一个HttpClient连接(随便拿到一个已经打开的浏览器使用),使用完成后HttpClient再归还到连接池中(让别人使用)。

下面的示例就是创建连接池以及设置请求配置的步骤,除此之外,无论是GET请求还是POST请求都无变化。

//HttpClient连接池
public class HttpClientPool {public static void main(String[] args) throws IOException {//创建HttpClient连接池:使用连接池管理器发起请求PoolingHttpClientConnectionManager pm = new PoolingHttpClientConnectionManager();//设置连接池最大连接数量pm.setMaxTotal(100);//设置每个主机(访问的目标主机)的最大连接数//每一个相同的主机最多获取10个连接数量:连接可以尽可能的达到一个数据均衡的目的pm.setDefaultMaxPerRoute(10);//设置请求设置:部分RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000)  //设置连接最长时间5000毫秒.setConnectTimeout(500)   //创建连接的最长时间:ms.setSocketTimeout(10 * 1000).build();  //设置数据传输的最长时间//设置请求信息doGet(pm, requestConfig);doGet(pm, requestConfig);}private static void doGet(PoolingHttpClientConnectionManager pm, RequestConfig config) throws IOException {//不每次都创建新的HttpClient,而是从连接池管理器中获取连接CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pm).build();//下面的部分就相同了String uri = "https://www.baidu.com/";HttpGet httpGet = new HttpGet(uri);//设置请求信息httpGet.setConfig(config);//CloseableHttpResponse response = httpClient.execute(httpGet);if (response != null && response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();String content = EntityUtils.toString(entity, "utf-8");System.out.println(content);}//关闭响应response.close();//注意!这就不用关闭HttpClient了,因为连接通过连接池管理了//httpClient.close();}
}

HttpClient Java客户端相关推荐

  1. httpclient妙用一 httpclient作为客户端调用soap webservice(转)

    前面有一篇使用HttpClient调用带参数的post接口方法,这里找到一篇使用HttpClient调用Soap协议接口的方式. 原文地址:httpclient妙用一 httpclient作为客户端调 ...

  2. java客户端api文档_Java 11:新的HTTP客户端API

    java客户端api文档 在Java 11中,已将最初在Java 9中引入的孵化HTTP客户端API进行了标准化. 它使连接URL,管理请求参数,cookie和会话更加容易,甚至支持异步请求和webs ...

  3. 用于Elasticsearch成绩单的Java客户端

    在本演讲中,我将介绍用于Elasticsearch和Spring Data Elasticsearch的三个不同的客户端. 首先,让我们看一下Elasticsearch的一些基础知识. 弹性搜索 为了 ...

  4. java esclient query_elasticsearch 口水篇(4)java客户端 - 原生esClient

    上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生 ...

  5. dwz java_dwz.cn接口java客户端实现

    项目中需要用到短网址,使用了dwz.cn java客户端工具类实现如下: 需要的jar包,Maven配置 com.alibaba fastjson 1.2.6 org.apache.httpcompo ...

  6. solr java 客户端_Solr JAVA客户端SolrJ的使用

    一.Solrj简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底 ...

  7. Memcached 集群环境Java客户端

    Memcached 集群环境Java客户端 学习了: http://blog.csdn.net/zhouzhiwengang/article/details/53154112 http://guazi ...

  8. 原生 Java 客户端进行消息通信

    原生 Java 客户端进行消息通信 Direct 交换器 DirectProducer:direct类型交换器的生产者 NormalConsumer:普通的消费者 MulitBindConsumer: ...

  9. 转载——Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

最新文章

  1. C++资源之不完全导引(上)
  2. ZJU-java进阶笔记 第七周(异常处理)
  3. ABAP性能优化之使用二分查找(Binary Search)选项
  4. php记录代码执行时间
  5. 小程序input获得焦点触发_小程序如何获得种子用户,微信9亿月活用户来教你!...
  6. 在centos7中安装MySQL5.7
  7. linux下加载qdm找不到驱动,Linux下共享文件夹的设置方法
  8. 鲜活的数据 : 数据可视化指南
  9. 关于protel 99se 汉化后某些菜单消失的解决方法
  10. 使用strace查看后台程序stdout输出
  11. 教你如何用CAD画向日葵
  12. Git cherry-pick 指令总结
  13. 【Wing Loss】《Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks》
  14. 出谋划策 小型网吧组网方案精心推荐(转)
  15. 固态硬盘linux 性能,一种提高linux系统固态硬盘性能的方法与流程
  16. 淘宝官方商品详情接口
  17. 这6部韩国电影你都看过吗?
  18. matlab共阳极二极管,三引脚SOT-323封装的共阳极稳压二极管详情
  19. PHP毕业设计源代码剧影评|剧评影评系统
  20. 自锁电路设计1.5V电压起

热门文章

  1. 个人爱好篇---纸模型
  2. 爱奇艺的Java缓存之路,你应该知道的缓存进化史!
  3. CSMA/CA协议详解【计算机网络】
  4. 第二周 day2:基础数据类型的补充:list,dict遍历删除/set的相关操作
  5. iis信息服务器 service unavailable,service unavailable解决方法
  6. 想了解大数据的鼻祖Hadoop技术栈,这里有一份优质书单推荐!
  7. 全世界第一台全自动3D立体
  8. ARKit 看这一篇就够了
  9. mysql查询时字段翻译_mysql-数据库问题:从表中获取默认翻译
  10. java chrono,Java Chrono现场单元