畅游HttpCore
欢迎
Q:我有一个问题。A:哦?什么问题,请讲。Q:如果把它放在新的包层次结构中,那使用老代码的应用程序就不是使用新的了啊?A:是的,由于老代码的设计上的限制,我们需要改动API。应用程序必须被重写,才能使用新的代码。没有办法避开这个问题。所有的新的包和老代码可以同时使用在相同的环境中,如Servlet引擎。
下面跟随我一起来了解org.apache.http。
消息
首先,我们需要处理消息的表示方式。如果你不知如何表示一个消息,你就不能发送或者接收它,对吧?因此,我们有一些用于创建HTTP消息的接口。RequestLine用于请求,StatusLine用于响应,它们都包含ProtocolVersion。ProtocolVersion是非常基础的,所以将其定义为类,而不是接口,当然,我们有HttpVersion继承自它。Header包含名字和值,值可以包含多个HeaderElement。最后还有一个表示消息体的HttpEntity。
Q:HttpVersion继承自ProtocolVersion?HttpCore中的协议不都是HTTP吗?
A:当前不是了。至少有一个不一样的协议,SIP(会话发起协议),它与HTTP有着相似的消息格式,只有协议的名字和版本是不同的。正是因为它们如此相似,我们试图保留它。
Q:明白了。
除了上述创建消息的接口,还要收集消息。每一个HttpMessage都有头,可以按照需求进行添加或者删除。HttpRequest添加请求行,HttpEntityEnclosingRequest是一个实体(后面都称为Entity)。HttpResponse添加状态行和一个Entity。为了方便集成到框架的工厂模式之中,有一些用于创建请求和响应的工厂接口。
Q:没有不带Entity的响应吗?
A:是的。你不需要给一个响应提供一个Entity,将它设置为null就好。对于请求,我们事先就知道是否需要一个Entity。对于GET请求,是不需要Entity的,这就是为什么提供了两个不同接口的原因。响应多数情况下是有Entity的,只有的极特别的情况下才是空。但是事先来处理一个响应是否有Entity使得API处理起来很麻烦,所以我们使用了相同的接口,都包含Entity。
Q:你说可以向HttpMessage添加或者从它删除头部,如果我想要一个只读的消息怎么办呢?
A:我们放弃了对消息是否可以修改进行区分的做法。因为那样将添加大量的接口,而且传播对类型的检查和向下转型。HttpCore面向的是知道她们在做什么的人群。如果你需要消息保持不变,简单的做法就是你不要去修改它
。如果你执意在阻止修改的话,你可以自己实现这个一个接口,当修改的方法被调用时抛出异常。
接下来看看这个包里还有些什么东西,你会发现最重要的东西,这就是org.apache.http.message包。注意,所有的消息表示接口都有一些基础的实现类,但当你使用HttpCore写应用程序的时候不需要接触这些实现类。
Q:我不能看到GetRequest和PostRequest等的实现吗?
A:是的,在核心中并不包含这些类。核心就是当之无愧的核心。如果你需要一个GET请求,你只需要创建一个基本的请求,然后将GET作为HTTP方法的名字,对于POST和PUT也同样如此,除非你想用它们创建一个基础的实现封装请求。在客户端你可以找到一些默认的HTTP方法便利的类,对于核心来说,它们是多余的。
Q:为什么可以使用GET方法创建实体封装请求,GET请求不没有Entity吗,这一点我不太明白?
A:哈哈,你可以用核心类来做一些愚蠢的事情。核心就是核心,这意味着使用它的人应该清楚的知道他们在做什么。也许你想创建一个带实体的GET方法,用于测试服务器是如何应对非法请求的?
Q:这倒是挺有意思的,我从来没有想过这样做。
对于基础的实现还有其他的问题吗?好的,我们继续下一个问题。我们来看一看org.apache.http.entity。你可以在这里面看到一系列的消息实体。除了它们不再绑定为客户端,消息实体与老代码中实现基本没有什么差别。在老代码中,可以从字符串、字节数组、文件、输入流获取实体的内容。在连接中收到的消息,对应于BasicHttpEntity。在下面会看到连接的内容。我们还做一些工作,用于封装、缓存实体。使用EntityTemplate可以简化对一个实体的实现。
Q:在老代码中实体有多个组成部分吗?
A:根本上来讲,是这样的。但它们并不在核心当中。即使对于老代码来讲,它也被认为已经越出范围。它是在httpmime中的模块,而我们直接使用的是mime4j,它同样添加了额外的依赖。HttpCore根本没有外部的依赖。
对于实体还有问题吗?没有我们就开始介绍连接。
连接
Q:我没有看到打开连接的方法啊?
A:你有鹰一样的眼睛,不是吗?你是对的,在接口中,没有打开一个连接的方法。在我们决定这一点上,花了大量的时间来讨论这个问题,打开一个连接比想象的更加复杂,所以我们没有将它们放在核心当中。
Q:如果我不能打开一个连接,那我该怎么使用连接呢?
A:API与实现不是一回事。在API中并没有类似open的方法,但你的实现中可以提供这样的方法。我们提供的默认实现,提供一个打开的套接口,你可以在任何时候创建它。
Q:套接口?我在接口当中也没有看到啊。是否可以设置TCP/IP的一些设置呢?
A:当前,了解套接口是十分有用的。但是,套接口并不属于核心API。有人可能会使用API而不是Java套接口与本地的库进行通信。我们会在下面介绍正确的实现方式。
Q:这是否意味着需要将实现类向下转型以获取IP和端口呢?
A:不,没有那么糟。有一个HttpInetConnection接口,提供了对本地及远程的IP和端口的访问,这只是一个可选的接口,但它是被默认实现支持的。你只需要向下转型为接口,而不是实现类。
在你问更多的问题之前,我们需要介绍点其他的东西,org.apache.http.impl,所有的连接的实现类都在这。不要迷惑,这样做只是为了代码的可维护性,你需要了解的只有两个类,DefaultHttpClientConnection和DefaultHttpServerConnection。提供了bind方法,传递一个打开的套接口,就打开了一个连接。由于继承自基类,也有getSocket方法。
https://wiki.apache.org/HttpComponents/GuidedTourOfHttpCore
畅游HttpCore的更多相关文章
- 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D
在CSDN上看到了<搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源>(http://www.csdn.net/article/2013-11-21/2817585-cha ...
- 搜狐畅游:每月给员工直系长辈2000元爱孝薪_企业新闻_265G产业频道
搜狐畅游:每月给员工直系长辈2000元爱孝薪_企业新闻_265G产业频道 搜狐畅游:每月给员工直系长辈2000元爱孝薪
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...
- 剑指Offer——搜狐畅游笔试题+知识点总结
剑指Offer--搜狐畅游笔试题+知识点总结 情景回顾 时间:2016.9.24 10:00-12:00 地点:山东省网络环境智能计算技术重点实验室 事件:搜狐畅游笔试 注意事项:要有大局观,该舍 ...
- [THUWC2017]在美妙的数学王国中畅游
[THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...
- 在平衡树的海洋中畅游(一)——Treap
记得有一天翔哥毒奶我们: 当你们已经在平衡树的海洋中畅游时,我还在线段树的泥沼中挣扎. 我觉得其实像我这种对平衡树一无所知的蒟蒻也要开一开数据结构了. 然后花了一天啃了下最简单的平衡树Treap,感觉 ...
- httpclient httpcore jar包及源码
HttpClient HttpCore HttpComponents jar src download httpclient home help
- 搜狐畅游CEO王滔辞职
凤凰科技讯 11月3日消息,搜狐公布公告确认搜狐畅游CEO离职.公告称王滔因个人原因辞去畅游首席运行官职务.将继续担任畅游公司董事和首席产品官. 据搜狐公告,董事会任命搜狐总裁余楚媛与畅游总裁陈德文为 ...
- Java中的http(网络处理)相关的库:HttpClient,HttpCore(转载)
[背景] 最近和之前,折腾了这个: [教程]模拟登陆百度之Java代码版 然后,对于Java的HttpClient,有了点了解. 现在整理如下: Java本身没有Http相关的库 Java本身,没有内 ...
随机推荐
- Web支持可暂停的超大文件上传
代码镇顶:https://github.com/dna2github/petalJS/blob/master/upload 前些天遇到用户须要上传10GB大小以上的文件的需求,查查网上的库.都不好用. ...
- linux中sed中用s 替换中遇到的问题
sed替换时候不能用-n,只输出替换的行,为什么???? 比如: sed "2,4s/\"//g" /var/lib/status #可以输出 但是: sed - ...
- ionic 调试 "死亡白屏"
死亡白屏(White Screen of Death) 我想“死亡白屏”应该是不需要解释的,开发过ionic app的童鞋应该都有遇到过,这里解释以防读者没有听说过:“可能在浏览器中调试时一切正常,当 ...
- vuex Payload 荷载
1.payload payload:有效载荷,即记录有效信息的部分. 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如这一批数据量的大小 ...
- 我的IT成长史,不以物喜,不以己悲
http://bbs.51cto.com/thread-1066048-1.html本人87年,出生在北方一座3线城市,从小学就喜欢计算机,带着鞋套去机房练习打英文字母:初中顺理成章的通过了计算机1级 ...
- leetCode 61.Rotate List (旋转链表) 解题思路和方法
Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For ex ...
- Oracle学习第三篇—多行函数
0 order by asc/desc 默认升序 order by 列的名字|表达式|别名|序号 把空放在后边:order by desc nulls last 1分组函数--会自动滤空值 count ...
- uva 12083 Guardian of Decency (二分图匹配)
uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...
- C#高级编程 第十五章 反射
(二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(At ...
- Yii2 跨库orm实现
近期在对公司的Yii2项目进行子系统拆分,过度阶段难免会有一些跨库操作,原生语句还好,加下库名前缀就可以了,可是到了orm问题就来了,特别是用到model做查询的时候,现在来记录一下跳过的坑, 像下面 ...
。如果你执意在阻止修改的话,你可以自己实现这个一个接口,当修改的方法被调用时抛出异常。