java.lang.Object
com.sun.net.httpserver.HttpExchange
- 所有已实现的接口:
-
Request,AutoCloseable
- 直接已知的子类:
-
HttpsExchange
这个类封装了一个接收到的HTTP请求和要生成的响应,提供了用于检查来自客户端的请求以及构建和发送响应的方法。
当请求的
HttpExchange的典型生命周期如下所示:
getRequestMethod()确定命令。getRequestHeaders()检查请求头(如果需要)。getRequestBody()返回一个用于读取请求体的InputStream。读取请求体后,应关闭流。getResponseHeaders()设置任何响应头,除了内容长度。sendResponseHeaders(int,long)发送响应头。必须在下一步之前调用。getResponseBody()获取一个用于发送响应体的OutputStream。写入响应体后,必须关闭流以终止交换。
当请求的
InputStream和响应的OutputStream都关闭时,交换将终止。关闭OutputStream会隐式关闭InputStream(如果尚未关闭)。但建议在关闭之前从InputStream中消耗所有数据。方便的方法close()执行所有这些任务。在没有消耗所有请求体的情况下关闭交换不会报错,但可能使底层TCP连接无法用于后续交换。未能终止交换的影响是未定义的,但通常会导致资源无法被释放/重用。
- 自1.6版本起:
- 1.6
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionabstract voidclose()通过按顺序执行以下操作来结束此交换:关闭请求InputStream(如果尚未关闭)。abstract ObjectgetAttribute(String name) Filter模块可以使用HttpExchange实例存储任意对象,作为一种离线通信机制。abstract HttpContext返回此交换的HttpContext。abstract InetSocketAddress返回接收请求的本地地址。abstract HttpPrincipalabstract String返回请求中的协议字符串,格式为protocol/majorVersion.minorVersion。abstract InetSocketAddress返回调用此请求的远程实体的地址。abstract InputStream返回一个流,可以从中读取请求体。abstract Headers返回一个不可变的包含与此请求一起包含的HTTP头的Headers。abstract String返回请求方法。abstract URI返回请求的URI。abstract OutputStream返回必须写入响应体的流。abstract int返回响应代码,如果已经设置。abstract Headers返回一个可变的Headers,其中可以存储HTTP响应头,并作为此响应的一部分传输。abstract voidsendResponseHeaders(int rCode, long responseLength) 使用当前设置的响应头和指定的数值响应代码开始向客户端发送响应。abstract voidsetAttribute(String name, Object value) Filter模块可以使用HttpExchange实例存储任意对象,作为一种离线通信机制。abstract void由Filters使用,以包装此交换的InputStream和OutputStream中的一个(或两个),使用给定的过滤流,以便后续调用getRequestBody()将返回给定的InputStream,并且调用getResponseBody()将返回给定的OutputStream。
-
Constructor Details
-
HttpExchange
protected HttpExchange()子类调用的构造函数。
-
-
Method Details
-
getRequestHeaders
返回一个不可变的包含与此请求一起包含的HTTP头的Headers。此
Headers中的键是头部名称,而值是包含请求中包含的每个值的List,按照它们被包含的顺序。多次出现的头字段表示为多个字符串值。Headers中的键不区分大小写。- 指定者:
-
getRequestHeaders在接口Request中 - 返回:
-
一个只读的
Headers,可用于访问请求头。
-
getResponseHeaders
返回一个可变的Headers,其中可以存储HTTP响应头,并作为此响应的一部分传输。Headers中的键是头部名称,而值必须是包含应包含多次的每个值的List,按照应包含的顺序。Headers中的键不区分大小写。- 返回:
-
一个可写的
Headers,可用于设置响应头。
-
getRequestURI
返回请求的URI。- 指定者:
-
getRequestURI在接口Request中 - 返回:
-
请求的
URI
-
getRequestMethod
返回请求方法。- 指定者:
-
getRequestMethod在接口Request中 - 返回:
- 请求方法字符串
-
getHttpContext
返回此交换的HttpContext。- 返回:
-
HttpContext
-
close
public abstract void close()通过按顺序执行以下操作来结束此交换:- 关闭请求
InputStream(如果尚未关闭)。 - 关闭响应
OutputStream(如果尚未关闭)。
- 指定者:
-
close在接口AutoCloseable中
- 关闭请求
-
getRequestBody
返回一个流,可以从中读取请求体。多次调用此方法将返回相同的流。建议应用程序在关闭之前应消耗(读取)此流中的所有数据。如果在读取所有数据之前关闭流,则InputStream.close()调用将读取并丢弃剩余数据(最多到特定数量的字节)。- 返回:
- 可以读取请求体的流
-
getResponseBody
返回必须写入响应主体的流。在调用此方法之前必须调用sendResponseHeaders(int,long)。对于同一交换,对此方法的多次调用将返回相同的流。为了正确终止每个交换,即使不发送响应主体,也必须关闭输出流。关闭此流会隐式关闭从
getRequestBody()返回的InputStream(如果尚未关闭)。如果调用
sendResponseHeaders(int, long)指定了固定的响应主体长度,则必须向此流写入在该调用中指定的确切字节数。如果写入的字节数过多,则OutputStream的写入方法将抛出IOException。如果写入的字节数过少,则流OutputStream.close()将抛出IOException。在这两种情况下,交换将被中止,并且底层TCP连接将关闭。- 返回:
- 写入响应主体的流
-
sendResponseHeaders
开始使用当前设置的响应头和此方法中指定的数字响应代码向客户端发送响应。响应主体长度也如下指定。如果响应长度参数大于零,则指定要发送的确切字节数,应用程序必须发送该确切数量的数据。如果响应长度参数为零,则使用分块传输编码,并且可以发送任意数量的数据。应用程序通过关闭OutputStream终止响应主体。如果响应长度的值为-1,则不发送响应主体。如果内容长度响应头尚未设置,则根据响应长度参数设置适当的值。
在调用
getResponseBody()之前必须调用此方法。- 实现注意:
-
此实现允许调用者在调用
sendResponseHeaders之前向响应头提供Connection: close头,以强制在交换终止后关闭连接。 - 参数:
-
rCode- 要发送的响应代码 -
responseLength- 如果> 0,则指定固定的响应主体长度,并且必须向从getResponseCode()获取的流写入确切数量的字节。如果== 0,则使用分块编码,并且可以写入任意数量的字节。如果<= -1,则未指定响应主体长度,且不得写入响应主体。 - 抛出:
-
IOException- 如果响应头已发送或发生I/O错误 - 参见:
-
getRemoteAddress
返回调用此请求的远程实体的地址。- 返回:
-
调用者的
InetSocketAddress
-
getResponseCode
public abstract int getResponseCode()返回响应代码,如果已经设置。- 返回:
-
响应代码,如果可用。如果尚不可用,则为
-1。
-
getLocalAddress
返回接收请求的本地地址。- 返回:
-
本地接口的
InetSocketAddress
-
getProtocol
返回请求中的协议字符串,格式为protocol/majorVersion.minorVersion。例如,"HTTP/1.1"。- 返回:
- 请求中的协议字符串
-
getAttribute
- 参数:
-
name- 要检索的属性的名称 - 返回:
-
属性对象,如果不存在则为
null - 抛出:
-
NullPointerException- 如果名称为null
-
setAttribute
- 参数:
-
name- 要与属性值关联的名称 -
value- 要存储为属性值的对象。允许null值。 - 抛出:
-
NullPointerException- 如果名称为null
-
setStreams
由过滤器用来包装此交换的InputStream和OutputStream中的一个(或两个),使用给定的过滤流,以便后续调用getRequestBody()将返回给定的InputStream,并且调用getResponseBody()将返回给定的OutputStream。提供给此调用的流必须包装原始流,并且可以是(但不需要是)FilterInputStream和FilterOutputStream的子类。- 参数:
-
i- 要设置为此对象的Inputstream的过滤输入流,如果不更改则为null -
o- 要设置为此对象的Outputstream的过滤输出流,如果不更改则为null
-
getPrincipal
- 返回:
-
HttpPrincipal,如果未设置验证器则为null
-