1.1 执行请求

HttpClient最重要的功能就是执行HTTP方法。HTTP方法的执行涉及到一个或几个HTTP请求和响应的交换,这通常在HttpClient内部处理。用户提供执行的请求对象,HttpClient传输此请求到目标服务器并返回对应的响应对象或者在执行不成的情况下抛出异常。

很自然地,HttpClientAPI的主要入口点是定义了上述描述的协议的HttpClient接口。

下面是一个简单的执行请求过程的示例:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {<...>
} finally {response.close();
}

1.1.1 HTTP请求

所有的HTTP请求都有一个包含方法名称、请求URI和一个HTTP协议版本的请求线。HttpClient支持所有HTTP/1.1定义的方法,这些方法是:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS。在HttpClient中和这些方法对应的类分别为HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace,HttpOptions。

URI(统一资源标识符)标记了一个可被请求的资源,HTTP请求URIs由协议概述、主机名称、资源路径、以及其他可选的(端口、查询参数)参数组成。

HttpGet httpget = new HttpGet("http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

HttpClient提供URIBuilder工具类简化请求URIs的创建。

URI uri = new URIBuilder()
.setScheme("http")
.setHost("www.google.com")
.setPath("/search")
.setParameter("q", "httpclient")
.setParameter("btnG", "Google Search")
.setParameter("aq", "f")
.setParameter("oq", "")
.build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

输出:

http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

1.1.2 HTTP响应

HTTP响应是在服务器接受并解析请求消息后返回给客户端的信息。信息的第一行由协议版本

、数字表示的状态码以及文本表示的状态组成。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK, "OK");System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString());

输出:

HTTP/1.1
200
OK
HTTP/1.1 200 OK

1.1.3 消息头

一个HTTP消息可以包含一些描述诸如消息长度、消息类型等的消息属性的头部信息,HttpClient

提供一些获取、添加、删除以及列举头部信息的方法。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
"c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
"c2=b; path=\"/\", c3=c; domain=\"localhost\"");
Header h1 = response.getFirstHeader("Set-Cookie");
System.out.println(h1);
Header h2 = response.getLastHeader("Set-Cookie");
System.out.println(h2);
Header[] hs = response.getHeaders("Set-Cookie");
System.out.println(hs.length);

输出:

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
2

最快的获取所有消息头部信息的方式是使用HeaderIterator接口

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie","c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie","c2=b; path=\"/\", c3=c; domain=\"localhost\"");
HeaderIterator it = response.headerIterator("Set-Cookie");
while (it.hasNext()) {System.out.println(it.next());
}

输出:

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

HttpClient也提供了方便的方法把HTTP头部消息解析成单个的元素。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie","c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie","c2=b; path=\"/\", c3=c; domain=\"localhost\"");
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator("Set-Cookie"));
while (it.hasNext()) {HeaderElement elem = it.nextElement();System.out.println(elem.getName() + " = " + elem.getValue());NameValuePair[] params = elem.getParameters();for (int i = 0; i < params.length; i++) {System.out.println(" " + params[i]);}
}

输出:

c1 = a
path=/
domain=localhost
c2 = b
path=/
c3 = c
domain=localhost

转载于:https://blog.51cto.com/wenshengzhu/1717751

HttpClient第一章(一)相关推荐

  1. HttpClient 中文官方教程----第一章基础知识-只收录,未测试

    2019独角兽企业重金招聘Python工程师标准>>> 第一章基础知识 英文链接:http://hc.apache.org/httpcomponents-client-ga/tuto ...

  2. httpclient4 中文版帮助文档,最新官方版翻译版(第一章 上)

    (第一章 上) 前言 超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了.Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴, ...

  3. 《进击吧!Blazor!》系列入门教程 第一章 7.图表

    作者备注 <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门系列视频,此系列能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:http ...

  4. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  5. 王道考研 计算机网络笔记 第一章:概述计算机网络体系结构

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 后续章节将陆续更新- 目录 一.概念.功能.组成.分类 1. 计算机网络的概念 2. 计算机网络功能 3. 计算 ...

  6. 计算机组成原理-第一章

    计算机组成原理第一章概述 一.计算机系统概述 1. 定义 2.分类 3.计算机系统的抽象层次 二.计算机系统的组成 1.计算机系统的硬件组成 1.1冯.诺依曼计算机(重点) 1.2现代计算机结构 1. ...

  7. 山西农业大学c语言答案,第一章C语言及程序设计概述-东北农业大学教务处.doc...

    全国高等农林院校"十一五"规划教材 C语言程序设计 孙力 主编 中国农业出版社 内容简介 本书是全国高等农林院校"十一五"规划教材之一. 全书共11章,分别介绍 ...

  8. Python3-Cookbook总结 - 第一章:数据结构和算法

    第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. ...

  9. 《零成本实现Web自动化测试--基于Selenium》第一章 自动化测试基础

    第一篇 Selenium 和WebDriver工具篇 第一章 自动化测试基础 1.1    初识自动化测试 自动化测试有两种常见方式 1.1.1 代码驱动测试,又叫测试驱动开发(TDD) 1.1.2 ...

最新文章

  1. FastDFS为什么要结合Nginx?
  2. 3个步骤,让你的手机上网速度飙升--转载
  3. Centos6 升级glibc-2.17,解决Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法
  4. 多线程之失败自动重试机制
  5. python iter 迭代函数 简介
  6. 图形工作站计算机大全,图形工作站价格怎么样 图形工作站报价大集锦【图文】...
  7. Eclipse使用添加tomcat后,默认部署目录不是tomcat/webapps,修改方法如下
  8. 内存和显存_【硬件资讯】显存再升级?Nvidia新卡实锤GDDR6X!显存大升级能否带来性能提升??...
  9. 训练日志 2019.4.14
  10. Maven-dependencyManagement与import
  11. 【生活相关】一(坚持)
  12. Emacs使用Tramp远程编辑服务器上的文件
  13. 如何选择适合你的兴趣爱好(十七),吉他
  14. 安卓ROOT全教程(测试机 红米Note7Pro)
  15. HTTP和MQTT协议实践
  16. Kafka---如何配置Kafka集群和zookeeper集群
  17. 惊!一文看懂Java NIO读写文件
  18. 我的世界JAVA挂机杀怪有经验_我的世界如何快速获得经验?
  19. 零基础入门推荐系统 - 新闻推荐(一)
  20. 丽水松阳计算机职业高中学校,浙江省丽水市松阳县职专

热门文章

  1. wmic 命令的一个汇总,功能很强大
  2. SAE下修改models里面字段
  3. 字符串与整数之间进行转换
  4. 企业级IT运维平台的发展趋势与规划要点
  5. Java 中文转拼音
  6. Docker 17.03系列教程(一)Docker EE/Docker CE简介与版本规划
  7. 基于jenkins结合git实现web程序的多服务器批量发布
  8. JavaScript面向对象与传统面向对象的一点区别
  9. Oracle RMAN 清除归档日志
  10. Struts2——(7)拦截器组件