HttpClient是什么?

HTTP 协议是 Internet 上使用得最多、最重要的协议之一,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。

虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。

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

HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。

简单来说就是:

  • JDK 的 java net包中有进行HTTP连接的功能,但是功能不够丰富和灵活。
  • HttpClient 是一个Apache 的工具包。
  • HttpClient 比 JDK 的 java net包的功能更加丰富和灵活。

主要的功能有:

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

(2)支持自动转向

(3)支持 HTTPS 协议

(4)支持代理服务器 等

说明一下:

HttpClient 和 HttpComponents 的关系?

我们先来看看 Apache 官网对两者的描述:

Commons HttpClient 项目现已结束,不再开发。它已被 HttpClient 和 HttpCore 模块中的 Apache HttpComponents 项目取代,提供更好的性能和更大的灵活性。

Apache HttpComponents 项目负责创建和维护专注于 HTTP 和相关协议的低级 Java 组件工具集。该项目在 Apache 软件基金会下运作,是更大的开发人员和用户社区的一部分。

简单来说就是:

  1. 两个都是 Apache 的项目
  2. 一开始是只有 HttpClient ,但是慢慢发展到现在就已经被废弃了,取而代之是 HttpComponents 。
  3. HttpComponents 比 HttpClient 更加强大,
    • HttpComponents 包含有更好的 HttpClient(HttpComponents Client
    • 除了 HttpClient,还包含有:HttpComponents CoreCommons HttpClient (legacy)
  4. 所以我们应该使用 HttpComponents 中的更好的 HttpClient(正如下文所展示的那样)。

如何使用?

首先,导包:

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

然后无论是发GET还是POST请求,使用起来最主要的步骤基本都是:

  1. 创建HttpClient对象
  2. 创建HttpGet或者HttpPost对象
  3. 通过HttpGet或者HttpPost对象设置请求头或请求参数等信息
  4. 通过HttpClient对象来执行HttpGet或者HttpPost对象,同时返回HttpResponse对象
  5. 通过HttpResponse对象可以获取到响应头和响应体的信息
  6. 关闭资源:关闭HttpClient对象和HttpResponse对象。

就是如此的简单。

下面看实际的代码:

GET方法:

@Test
public static void doGet() {String url = "http://baiu.com/abc?key1=name&key2=name2";// 1.创建httpclientCloseableHttpClient httpClient = HttpClients.createDefault();// 2.创建HttpGetHttpGet httpGet = new HttpGet(url);try {// 3.设置请求参数信息httpGet.setHeader("Accept-Language", "zh-cn,zh;q=0.5");// 4.请求执行,获取响应CloseableHttpResponse response = httpClient.execute(httpGet);// 5.获取响应实体String result = EntityUtils.toString(response.getEntity(), "UTF-8");System.out.println(result);// 6.关闭资源response.close();} catch (IOException e) {e.printStackTrace();}finally {try {// 6.关闭资源httpClient.close();} catch (IOException e) {e.printStackTrace();}}
}

POST方法:

@Test
public static void doPost() {String url = "http://baiu.com/abc";// 1.创建httpClientCloseableHttpClient httpClient = HttpClients.createDefault();// 2.创建httpPostHttpPost httpPost = new HttpPost(url);// 3.1创建参数列表List formParams = new ArrayList();formParams.add(new BasicNameValuePair("username", username));formParams.add(new BasicNameValuePair("userpass", userpass));formParams.add(new BasicNameValuePair("useryzm", useryzm));try {// 3.2设置请求参数信息UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(formParams, "GBK");httpPost.setEntity(urlEncodedFormEntity);// 4.请求执行,获取响应CloseableHttpResponse response = httpClient.execute(httpPost);// 5.获取响应实体String result = EntityUtils.toString(response.getEntity(), "UTF-8");System.out.println(result);// 6.关闭资源response.close();} catch (IOException e) {e.printStackTrace();} finally {try {// 6.关闭资源httpClient.close();} catch (IOException e) {e.printStackTrace();}}
}

有中文参数怎么办?

众所周知:GET请求的参数是显示在url中的,而POST请求的参数是在请求体里面的,不会显示在url上。

所以,就可以分为两种情况:

  1. GET请求的url中有中文参数
  2. POST请求的请求体里面有中文参数

GET请求的url中有中文参数

很简单,在参数拼接到url之前,先把参数进行编码。

String newName1 = URLEncoder.encode(oldName1, "GBK")

然后才拼接成一个完整的url

String newUrl = oldUrl + "?" + "key1=" + newName1 + "&key2=" + oldName2 ;

然后就可以拿着这个newUrl进行GET请求了。

注意:

  • 是对带有中文的参数进行单独的encode,而不是对整个url进行encode
  • encode的编码方式需要根据服务端来选择,大多数为UTF-8,我这里比较特殊是GBK

另:URLEncoder 类是 JDK自带的,可以直接使用。

import java.net.URLEncoder;

POST请求的请求体里面有中文参数

这种情况就更加的简单,只需要在设置请求体的参数时,指定编码方式就可以了:

// 3.2设置请求参数信息
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(formParams, "GBK");
httpPost.setEntity(urlEncodedFormEntity);

**注意:**编码方式需要根据服务端来选择,大多数为UTF-8,我这里比较特殊是GBK

有xml格式的参数怎么办?

其实不管是xml格式的参数还是中文参数,

对于HTTP请求来说都是非法字符,

所有的非法字符都可以使用上面处理中文参数的方法来解决。

所以不论是GET还是POST,参照上述方法处理就行了。

最后

如果想了解更加深入的HttpClient知识,可以到官网查看详细的教程:http://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/html/

HttpComponents和HttpClient基本用法相关推荐

  1. tornado.httpclient.HTTPClient()的用法

    转载自: 使用tornado的httpclient模拟客户端 但是链接中的代码最早是2014年的,所以2020年已经失效了. 下面是python3.6下面跑通的版本: import tornado.h ...

  2. HttpComponents之httpclient基本使用方法

    2019独角兽企业重金招聘Python工程师标准>>> httpclient的版本是4.3 第一种方式 package http;import org.apache.http.Htt ...

  3. HttpComponents组件探究 - HttpClient篇

    在Java领域,谈到网络编程,可能大家脑海里第一反应就是MINA,NETTY,GRIZZLY等优秀的开源框架.没错,不过在深入探究这些框架之前,我们需要先从最original的技术探究开始(当然,需要 ...

  4. 通过FD耗尽实验谈谈使用HttpClient的正确姿势

    一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...

  5. 学习HttpClient,从两个小例子开始

    前言 HTTP(Hyper-Text Transfer Protocol,超文本传输协议)在如今的互联网也许是最重要的协议,我们每天做的很多事情都与之有关,比如,网上购物.刷博客.看新闻等.偶尔你的上 ...

  6. java httpclient cdn_通过FD耗尽实验谈谈使用HttpClient的正确姿势

    一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...

  7. java 手机网页_Java爬虫: 爬取京东上的手机搜索页面 HttpClient+Jsoup

    1.需求及配置 需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格. 使用Maven项目,log4j记录日志,日志仅导出到控制台. Maven依赖如下 ...

  8. Android Volley入门到精通:初识Volley的基本用法

    1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...

  9. Android Volley完全解析1:初识Volley的基本用法

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 1. Volley简介 我们平时在开发Android应用的 ...

最新文章

  1. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(分组颜色配置、位置配置)实战
  2. SpringSecurity认证用户状态的判断
  3. matlab实现图像放大两倍,matlab图像处理基础知识0(双线性插值matlab实现--调整水平和垂直放大倍数)...
  4. java 异步调用webapi_Async Await异步调用WebApi
  5. mysql存储过程详解以及PHP调用MYSQL存储过程实例
  6. 幅相频率特性曲线的绘制(1)
  7. 【IoT】产品设计:OEM、ODM、EMS 的区别是什么?
  8. 什么是类?以及类的分类
  9. 置信区间、置信水平、边际误差
  10. Floyd-Warshall算法(Floyd-Warshall algorithm)
  11. 在Vue里使用G2地图制作省级地图展示各市级数据
  12. 什么是裸金属服务器,裸金属服务器适用什么场景?
  13. 现下追求互动体验强的时代,企业展厅给客户传递更为全面的信息
  14. CCF CSP认证——201312
  15. 第二阶段--团队冲刺--第十天
  16. [工具使用]Wireshark
  17. 暴风魔镜之虚拟漫游(更新中。。。)
  18. HCIP高级网络知识整理(十分详细)
  19. C语言的一个程序是怎么执行的
  20. 戴尔台式计算机寿命,台式电脑一般能用几年 哪些品牌比较好

热门文章

  1. 爬取数据是违法的吗_爬取生意参谋数据是不是违规行为?有什么后果呢?
  2. 【数据治理】浅谈数据治理
  3. 痛惜!才29岁,年轻博士不幸离世
  4. RNA-seq中的基因表达量计算和表达差异分析
  5. 开源Math.NET基础数学类库使用(01)综合介绍
  6. k8s-大型分布式集群环境捷径部署
  7. 美学心得(第一百九十七集) 罗国正
  8. 第二章:Linux系统目录介绍+第三章:Linux系统文件类型和文件权限
  9. 《sql学习指南》笔记1-10章
  10. 手机自带软件偷流量 厂商称强删无法质保