爬虫之对接口HttpEntity的解释(二)
前言
之前写了一些关于如何使用HttpClient包基本功能HttpGet与HttpPost。在其中提到了HttpEntity接口。这篇文章是对HttpEntity接口深入的探讨。
一、使用的位置与方式
HttpEntity是在HttpCore包中实现的,下面以HttpGet中使用位置为例(参见上一篇)
DefaultHttpClient httpClient = new DefaultHttpClient(); (A)
HttpGet httpGet = new HttpGet(url); (B)
HttpResponse httpResponse = httpClient.execute(httpGet); (C)
HttpEntity httpEntity = httpResponse.getEntity(); (D)
Do something on httpEntity (E)
EntityUtils.consume(httpEntity) (F)
httpGet.releaseConnection()
HttpEntity其实相当于一个消息实体,内容是http传送的报文(这里可以说是html,css等等文件)。这里只需要知道它是用来表征一个http报文的实体就行了,用来发送或接收。通过上面的例子,可以对使用HttpEntity有一些认识。实现HttpEntity接口有不同的类,下面介绍。
二、HttpEntity的分类
按HttpEntity内容的来源,它可以分为三类:
1.streamed(流式):从一个流传输中获得,一般是来自http连接。特点:使用时产生,不可重复
2.self-contained(自包含):存储在内存中的,独立于http连接。特点:可以重复
3.wrapping(代理,包装):从其他HttpEntity中获得。特点:依附于获取的类
在HttpEntity帮助文档中建议,将实时性的不可重复的作为流式实体处理,把可重复的(如果不会产生巨大影响)作为自我包含实体处理。
三、HttpEntity的方法介绍
HttpEntity类非常简洁,它的方法如下:
InputStreamgetContent()返回的是一个实体内容的流
注:此时这里的流与上面所说的流式实体概念有所不同。上文所说流式实体是指从连接产生具有实时性的流,而这里仅仅只内容流形式,不要混淆。
HeadergetContentEncoding()获取HttpEntity(如果有的话)实体已编码内容的头部信息(具体Header内容可以参见HttpCore帮助文档中Header类)
Long getContentLength()显而易见是获取整个实体内容的长度
BooleanisRepeatable()判断实体是否具有重现的能力,也就是一中讨论的分类
BooleanisStreaming()判断实体的内容是不是基于流
VoidwriteTo(OutputStream outstream)将实体写入一个输出流
四.实现接口HttpEntity的类
这些实现接口HttpEntity的类,其实就是在HttpEntity功能上添加了一些小小的功能。看这些类的名字就能知道它添加了什么功能。
类如下:
AbstractHttpEntity,BasicHttpEntity,BufferedHttpEntity,ByteArrayEntity,InputStreamEntity,StringEntity等等。如果在接下来的文章中有用到的话,我会提及一部分。其实这些类非常简单,完全可以自己实现。也可以参考HttpCore帮助文档。
后记
我发现自己写的内容都很简单,甚至说是很幼稚。但是,我想如果对一个已经很熟练的人来说,这样的文章也许没用,他也完全不需要去看。但是如果对一个刚刚开始学习的人来说,也许意义会有所不同,他会少走很多弯路。不过,随着学习爬虫不停地深入,我想会写出一些能值得参考的东西来的。所以,不喜勿喷。