概述
4、http entity
在http Message 中可以携带与请求或者响应相关联的内容实体,在请求和响应中,内容实体是可选的,也就是说请求和响应中可以没有内容实体。Http 规范中,包含内容实体的请求有两种PUT和GET,响应通常会包含内容实体,但是也有例外,例如对于HEAD方法的响应、204 Not Content的响应、304 Not Modified的响应、205 Reset Content的响应均没有内容实体。
HttpCore 根据内容的来源区分了三种内容实体:
- streamed: 内容从流中获得,或者从运行中产生。这一类中比较典型的是从Http 连接中获得的实体。通常,流式实体是不可重复的
- self-contained:内容从内存中或者从一个独立的连接或其他实体中获得,通常是可重复的
- self-contained:内容从另外一个实体中获得
(1)、可重复的实体
一个实体是可重复的,也就是说这个实体可以被读超过一次,只有self-contained实体可以。(eg:ByteArrayEntity、StringEntity)
(2)、Http Entity 的使用
HttpEntity 接口定义了一系列方法来获取内容实体
方法 | 作用 |
---|---|
InputStream getContent() | 以流的方式返回实体内容 |
void writeTo(OutputStream outputStream) | 将实体内容写到一个输出流中 |
Header getContentEncoding() | 获得Content-Encoding的header |
long getContentLength() | 获得实体内容的长度 |
Header getContentType() | 获得Content-Type的header |
boolean isChunked() | 判断实体是否分块编码 |
boolean isRepeatable() | 判断实体是否可以不止一次的生成数据 |
boolean isStreaming() | 判断实体是否依赖于一个基础流 |
EntityUtils 提供了几个静态方法用来简单的提取实体的内容和相关信息
静态方法 | 作用 |
---|---|
void consume(HttpEntity entity) | 确保实体内容已完全消耗,并且内容流(如果存在)已关闭 |
void consumeQuietly(HttpEntity entity) | 与上一个方法作用相同,但此方法不会抛出任何异常 |
byte[] toByteArray(HttpEntity entity) | 读取实体内容并按字节数组返回 |
String toString(HttpEntity entity) | 读取实体内容并按字符串返回,实体中存在字符节使用该字符集,否则使用ISO-8859-1 |
String toString(HttpEntity entity, CharSet charSet) | 读取实体内容并按指定的字符集返回字符串 |
String toString(HttpEntity entity CharSet charSet) | 同上 |
void updateEntity(HttpResponse response, HttpEntity entity) | 首先消耗现有实体,然后设置新的实体,并在提供的response中更新实体 |
示例代码:
public void httpEntityTest() throws Exception {
HttpEntity entity = new StringEntity("my message", Consts.UTF_8);
System.out.println(entity.getContent().toString());
//java.io.ByteArrayInputStream@429bd883
System.out.println(entity.getContentLength());
//10
System.out.println(entity.getContentEncoding());
//null
System.out.println(entity.getContentType());
//Content-Type: text/plain; charset=UTF-8
System.out.println(entity.isChunked());
//false
System.out.println(entity.isRepeatable());
//true
System.out.println(entity.isStreaming());
//false
System.out.println(EntityUtils.toString(entity));
//my message
}
(3)、HttpCore 提供的HttpEntity的实现类
- BasicHttpEntity : 通常将此类用于Http message接受的实体
常用的方法:
void setContent(InputStream)
void setContentLength(long)
- ByteArrayEntity :是一个self-contained 的可重复的实体
- StringEntity : 是一个self-contained 的可重复的实体
- InputStreamEntity :是一个streamed 不可重复的实体
- FileEntity :是一个self-contained 的可重复的实体
- HttpEntityWrapper :这是我们创建一个包装实体类的基类
- BufferedHttpEntity : 这是HttpEntityWrapper的一个子类,能够从实体中读取内容并缓存,它使得由不可重复的实体组成可重复的实体成为可能
5、Http 协议处理器
(1)、概述
HTTP协议处理器是一个实现责任链模式的HTTP协议拦截器的集合,每个单独的协议拦截器将在它负责的HTTP协议的特定方面工作。HTTP协议拦截器通常是由装饰器模式实现的。每一个HTTP协议拦截器必须实现线程安全。
(2)、HttpCore所提供的标准的协议拦截器
- RequestContent : 传出请求最重要的拦截器,是客户端协议处理器正确运行所必须的
- ResponseContent : 传出响应最重要的拦截器,是服务端协议处理器正确运行所必须的
- RequestConnControl : 负责添加Connection 的 header 到请求中
- ResponseConnControl : 负责添加Connection 的 header 到响应中
- RequestDate : 负责添加Data 的 header 到请求中
- ResponseDate : 负责添加Data 的 header 到响应中
- RequestExpectContinue : 负责通过添加 Expect 的 header 来启用expect-continue握手
- RequestTargetHost :负责添加 Host 的 header
- RequestUserAgent : 负责添加 User-Agent 的 header
- ResponseServer : 负责添加 Server 的 header
(3)、http 协议处理器的使用
示例代码:
public void httpProcessorTest() throws Exception {
HttpProcessor httpProcessor = HttpProcessorBuilder.create()
.add(new RequestContent())
.add(new RequestTargetHost())
.add(new RequestConnControl())
.add(new RequestUserAgent())
.add(new RequestExpectContinue(true))
.build();
HttpCoreContext context = HttpCoreContext.create();
HttpRequest request = new BasicHttpRequest("GET", "www.baidu.com",HttpVersion.HTTP_1_1);
httpProcessor.process(request, context);
}
6、HTTP 执行上下文
最初HTTP协议被设计为一种无状态的,面向请求响应的协议。但实际的应用需要能够在几个逻辑相关的请求响应中保存状态信息。Http Context 就是用来让应用程序保存处理状态。Http Context 的设计与Map < String, Object > 相似,都是简单的键值对集合。
由于HttpContext可以包含任意的对象,为了多线程情况下的安全,必须确保同时只能有一个线程访问HttpContext。
如果连续请求之间重用了相同的 context,那么多个逻辑相关的消息就可以加入一个逻辑 session 中。
示例代码:
public void httpContextTest() throws Exception {
HttpProcessor httpProcessor = HttpProcessorBuilder.create()
.add(new HttpRequestInterceptor() {
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
String id = (String) context.getAttribute("session-id");
if(id!=null) {
request.addHeader("Session-Id",id);
}
}
})
.build();
HttpCoreContext context = HttpCoreContext.create();
HttpRequest request = new BasicHttpRequest("GET", "www.baidu.com", HttpVersion.HTTP_1_1);
httpProcessor.process(request, context);
}
之后内容见下一篇博客 HttpCore 教程(三)
之前内容见上一篇博客 HttpCore 教程(一)
最后
以上就是迷人香烟为你收集整理的HttpCore 教程(二)的全部内容,希望文章能够帮你解决HttpCore 教程(二)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复