【HttpClient4.5中文教程】【第一章 :基础】1.1运行请求(二)
很多其它HttpClient4.5中文教程请查看:点击打开链接
1.1.4.HTTP实体(HTTP Entity)
HTTP报文可以携带与请求或对应相关联的内容实体。实体存在于某些请求、响应中,它门是可选的。
使用实体的请求被称为内含实体请求【译者:原文为entity enclosing requests。我把它翻译为 内含实体请求】。
HTTP规范定义了两种内含实体请求。POST和PUT。而响应总是内含实体。
但有些响应不符合这一规则,比方,对HEAD方法的响应和状态为204 No Content,
304 Not Modified, 205 Reset Content的响应。
根据实体的内容来源,HttpClient区分出三种实体:
流式实体(streamed):内容来源于一个流。或者在执行中产生【译者:原文为generated on the fly】。特别的,这个类别包含从响应中接收到的实体。
流式实体不可反复。
自包括实体(self-contained):在内存中的内容或者通过独立的连接/其它实体获得的内容。自包括实体是可反复的。这类实体大部分是HTTP内含实体请求。
包装实体(wrapping):从另外一个实体中获取内容。
1.1.4.1 可反复实体
一个实体可以被反复,意味着它的内容可以被读取多次。它仅可能是自包括实体(像ByteArrayEntity或StringEntity)
1.1.4.2 使用HTTP实体
因为一个实体可以表现为二进制和字符内容,它支持二进制编码(为了支持后者。即字符内容)。
实体将会在一些情况下被创建:当运行一个含有内容的请求时或者当请求成功。响应体作为结果返回给client时。为了读取实体的内容。能够通过HttpEntity#getContent() 方法取出输入流。返回一个java.io.InputStream,或者提供一个输出流给HttpEntity#writeTo(OutputStream) 方法,它将会返回写入给定流的全部内容。
当实体内部含有信息时,使用HttpEntity#getContentType()和HttpEntity#getContentLength()方法将会读取一些主要的元数据,比方Content-Type和Content-Length这种首部(假设他们可用的话)。因为Content-Type首部可以包括文本MIME类型(像 text/plain 或text/html),它也包括了与MIME类型相相应的字符编码。HttpEntity#getContentEncoding()方法被用来读取这些字符编码。假设相应的首部不存在,则Content-Length的返回值为-1,Content-Type返回值为NULL。假设Content-Type是可用的,一个Header类的对象将会返回。
当我们构建一个具有可用信息的实体时,元数据将会被实体构建器提供。【译者:我理解的是。如以下样例中的长度,并没有声明,可是可用,是构建器生成的】
StringEntity myEntity = new StringEntity("important message",
ContentType.create("text/plain", "UTF-8"));
System.out.println(myEntity.getContentType());
System.out.println(myEntity.getContentLength());
System.out.println(EntityUtils.toString(myEntity));
System.out.println(EntityUtils.toByteArray(myEntity).length);
输出:
Content-Type: text/plain; charset=utf-8
17
important message
17
1.1.5.确保释放低级别的资源
为了确保正确的释放系统资源,你必须关掉与实体与实体相关的的内容流。还必须关掉响应本身。
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
try {
// do something useful
} finally {
instream.close();
}
}
} finally {
response.close();
}
关闭内容流和关闭响应的不同点是:前者将会通过消费实体内容保持潜在的连接。而后者迅速的关闭并丢弃连接。
请注意,一旦实体被HttpEntity#writeTo(OutputStream)方法成功地写入时,也须要确保正确地释放系统资源。假设方法获得通过HttpEntity#getContent(),它也须要在一个finally子句中关闭流。
当使用实体时,你能够使用EntityUtils#consume(HttpEntity)方法来确保实体内容全然被消费而且使潜在的流关闭。
某些情况。整个响应内容的只一小部分须要被取出。会使消费其它剩余内容的性能代价和连接可重用性代价太高,这时能够通过关闭响应来终止内容流。
【译者:样例中能够看出,实体输入流只读取了两个字节,就关闭了响应,也就是按需读取,而不是读取所有响应】
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
int byteOne = instream.read();
int byteTwo = instream.read();
// Do not need the rest
}
} finally {
response.close();
}
这样,连接将不会被重用,它分配的全部级别的资源将会被解除。
1.1.6.消费实体内容
为了消费实体内容,推荐的方式是使用HttpEntity#getContent()或者 HttpEntity#writeTo(OutputStream)方法。HttpClient也提供了一个EntityUtils类,它有几个静态方法更easy的从实体中读取内容或信息。
代替了直接读取java.io.InputStream,你能够通过这个类的方法取出所有内容体并放入一个String 中或者byte数组中。
但是,强烈不建议使用EntityUtils,除非响应实体来自于信任的HTTPserver而且知道它的长度。【译者:】
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
long len = entity.getContentLength();
if (len != -1 && len < 2048) {
System.out.println(EntityUtils.toString(entity));
} else {
// Stream content out
}
}
} finally {
response.close();
}
在某些情况下,多次读取实体内容是必要的。在这样的情况下,实体内容必须以一些方式缓冲,内存或者硬盘中。为了达到这个目的,最简单的方法是把原始的实体用BufferedHttpEntity类包装起来。这将会使原始实体的内容读入一个in-memory缓冲区。
全部方式的实体包装都是代表最原始的那个实体。
CloseableHttpResponse response = <...>
HttpEntity entity = response.getEntity();
if (entity != null) {
entity = new BufferedHttpEntity(entity);
}
==================总结=====================
1.经过前面两节的学习,你已经掌握HttpClient4.5的基本使用方法了~赶快去试一下吧~
【HttpClient4.5实训】一.GET请求訪问新浪网(非原文教程)点击打开链接
【HttpClient4.5中文教程】【第一章 :基础】1.1运行请求(二)的更多相关文章
- 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因
1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...
- [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍
注:为了看上去比较清晰这里只转载了中文 原地址: [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍 本章将引导您完成安装和设置开发环境,然后你就可 ...
- [ABP教程]第一章 创建服务端
Web应用程序开发教程 - 第一章: 创建服务端 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发 ...
- 《进击吧!Blazor!》系列入门教程 第一章 8.部署
<进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...
- .net架构设计读书笔记--第一章 基础
第一章 基础 第一节 软件架构与软件架构师 简单的说软件架构即是为客户构建一个软件系统.架构师随便软件架构应运而生,架构师是一个角色. 2000年9月ANSI和IEEE发布了<密集性软件架构建 ...
- Laxcus大数据管理系统2.0(2)- 第一章 基础概述 1.1 基于现状的一些思考
第一章 基础概述 1.1 基于现状的一些思考 在过去十几年里,随着互联网产业的普及和高速发展,各种格式的互联网数据也呈现爆炸性增长之势.与此同时,在数据应用的另一个重要领域:商业和科学计算,在各种新兴 ...
- Linux系统shell编程自学_第一章基础
第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...
- wpf(第一章 基础知识)
wpf第一章基础知识:通过vs2015创建wpf程序会在引用里面多出3个核心程序集PresentationCore.PresentationFramework.WindowsBase.并且会在解决方案 ...
- javascript进阶教程第一章案例实战
javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...
随机推荐
- MySQL-python install
Redhat 7.6 yum install python-devel mysql-devel gcc -y pip install MySQL-python==1.2.5
- Topcoder 刷题之路_鶸的奋斗
最近碰到的题不是水题就是坑题,实在没意思,听说神犇们都在Topcoder上刷SRM,于是我决定将SRM的DIV 1刷个遍.这里是目录 哎..好多转博客不注明出处的,这里给出本博客的出处:http:// ...
- [COCI2015]ZMIJA
题目大意: 一个$n\times m(n,m\leq1000)$的格子中有若干金币,从左下角出发,每一步可以进行如下操作: 1.向当前方向前进一格: 2.向上移动一步,并调转当前方向. 一开始的方向是 ...
- MySQL中in子查询会导致无法使用索引问题(转)
MySQL的测试环境 测试表如下 create table test_table2 ( id int auto_increment primary key, pay_id int, pay_time ...
- squid.conf 的cache_peer 详解
通过squid.conf配置文件中的cache_peer选项来配置代理服务器阵列,通过其他的选项来控制选择代理伙伴的方法.Cache_peer的使用格式如下: cache_peer hostname ...
- 级联关系(内容大部分来自JavaEE轻量型解决方案其余的是我的想法)
1. 级联关系 在Hibernate程序中持久化的对象之间会通过关联关系互相引用.对象进行保存.更新和删除等操作时,有时需要被关联的对象也执行相应的操作,如:假设需要关联关系的主动方对象执行操作时,被 ...
- securecrt中进入uboot命令行时,出现无法键入任何指令的问题解决方法
securecrt中进入uboot命令行时,出现无法键入任何指令的问题解决方法 可能出现以下几种情况 1.securecrt在创建连接时,忘记取消勾选流控: 2.usb转串口线坏了3.uboot有问题 ...
- MongoDB系列四:解决secondary的读操作
http://blog.itpub.net/26812308/viewspace-2124660/ 在Replica sets 中的secondary节点默认是不可读的.使用Replica Sets实 ...
- Spark-Join优化之Broadcast
适用场景 进行join中至少有一个RDD的数据量比较少(比如几百M,或者1-2G) 因为,每个Executor的内存中,都会驻留一份广播变量的全量数据 Broadcast与map进行join代码示例 ...
- 排序效率小PK
上个小demo看看 import com.google.common.primitives.Chars; import java.util.*; /** * java中数组转List使用Arrays. ...