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. 修改网站自动关闭时间timeout_Testbench仿真方法2:在Quartus下Testbench编写及脚本文件修改...
  2. binder,hwbinder,vndbinder之间的关系
  3. Maya Calendar
  4. 浅析如何通过PHP类的反射来实现依赖注入
  5. luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
  6. py脚本实现用例执行html报告,pytest文档7-pytest-html生成html报告
  7. 2018年,这100家AI公司值得关注!CB Insights选出AI 100第二季
  8. 华为路由模拟器3.0参考实验7----直连路由无法ping通解决办法
  9. 两栏 论文首页 插尾注方法 word2019
  10. linux shell 中各种符号的含义
  11. 赵小楼《天道》《遥远的救世主》深度解析(66)辩证思维的讨论:人性、教义、逻辑
  12. 微信小程序 教学质量问卷调查 小程序实现
  13. 部编版是什么版本_人教版是部编还是统编
  14. 原创轻量VIO算法、简单易上手——XRSLAM帮你快速搭建移动平台AR应用
  15. 攻防世界MISC———Dift
  16. 华为交换机SNMP读取LLDP邻居信息的特殊配置
  17. git 远程仓库相关命令
  18. window7旗舰版SP1官方原版自激活镜像iso
  19. GPS网检验重复边和同步环是否合格
  20. 计算机上wps表格乘除算法,WPS excel如何快速运算单个单元格中的乘除法?

热门文章

  1. 奇数分频器的原理及实现
  2. MybatisPlus-注解
  3. 互动媒体技术有关十二个“一”的文艺创作-拓展版
  4. 一个年轻程序员的人生感悟
  5. java初级工程师必须具备的十三个技能点
  6. 20135331文艺实验三
  7. Windows OS中关闭445 Port
  8. 你的第一个独立游戏失败了?告诉你下一步该做什么
  9. 愿我成为一名优雅的程序媛
  10. 随想杂谈(06-06-30)