我是靠谱客的博主 迷人香烟,最近开发中收集的这篇文章主要介绍HttpCore 教程(二),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 教程(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部