1 HttpCore是什么?
HttpCore是对HTTP协议的基础封装的一套组件。
- 可以用它来建立客户端、代理、服务端Http服务
- 支持同步异步服务
- 一系列基于阻塞和非阻塞IO模型
2 HTTP消息简析
一个HTTP消息包含Header和可选的Body.
- 请求头(Request Header)由一个请求行和一系列的头字段组成。
- 响应头(Response Header)由一个状态行和一系列的头字段组成。
- HTTP消息必须包含HTTP版本。
几个基本操作:
// GET / HTTP/1.1 # 请求
HttpRequest request = new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1)
// HTTP/1.1 200 OK # 响应
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
HTTP消息实体
HttpCore根据内容来源分成三种实体:
- streamed, 从流中接收,来自连接,不可重复读。
- self-contained, 存储于内存中独立于连接,可重复读。 如: ByteArrayEntity
、 StringEntity
.
- wrapping, 从另外一个消息实体获得。
HttpCore Http Entity的一些Java实现: BasicHttpEntity
、ByteArrayEntity
、StringEntity
、 InputStreamEntity
、FileEntity
、HttpEntityWrapper
、BufferedHttpEntity
Http协议处理:
RequestContent
、ResponseContent
、RequestConnControl
、ResponseConnControl
、RequestDate
、ResponseDate
、RequestExpectContinue
、RequestTargetHost
、RequestUserAgent
、ResponseServer
3 阻塞I/O模型
由于建立一个连接的过程十分复杂,HttpCore并没有提供对http开放连接的全部支持。
中断Http连接:
HttpConnection#close(); //线程非安全
HttpConnection#shutdown() //线程安全
HTTP/1.1定义的三种内容传输机制:
- Content-Length delimited 内容长度区间, 最大长度Long#MAX_VALUE
- Identity coding 仅能用于服务器端,末尾有结束标志,最大长度无限制
- Chunk coding 块传输。最大长度无限制
HttpService:
HttpProcessor processor = HttpProcessorBuilder.create().add(new ResponseDate())
.add(new ResponseServer("My Response Server 1.1"))
.add(new ResponseContent())
.add(new ResponseConnControl())
.build();
HttpService service = new HttpSer