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
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述abstract voidclose()通过按顺序执行以下操作结束此交换:关闭请求InputStream,如果尚未关闭。abstract ObjectgetAttribute(String name) Filter模块可以使用HttpExchange实例存储任意对象作为带外通信机制。abstract HttpContext返回此交换的HttpContext。abstract InetSocketAddress返回收到请求的本地地址。abstract HttpPrincipalabstract String从表单中的请求返回协议字符串协议/majorVersion.minorVersion.abstract InetSocketAddress返回调用此请求的远程实体的地址。abstract InputStream返回一个流,可以从中读取请求正文。abstract Headers返回一个不可变的Headers,其中包含此请求中包含的 HTTP 标头。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过滤器 使用此交换器的InputStream和OutputStream之一(或两者),使用给定的过滤流,以便后续对getRequestBody()的调用将返回给定的InputStream,对getResponseBody()的调用将返回给定的OutputStream。
-
构造方法详细信息
-
HttpExchange
protected HttpExchange()子类调用的构造方法。
-
-
方法详情
-
getRequestHeaders
返回一个不可变的Headers,其中包含此请求中包含的 HTTP 标头。此
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的 write 方法将抛出IOException。如果写入的字节太少,则流OutputStream.close()将抛出IOException。在这两种情况下,交换都会中止并且底层 TCP 连接会关闭。- 返回:
- 写入响应主体的流
-
sendResponseHeaders
开始使用当前的响应标头集和此方法中指定的数字响应代码将响应发送回客户端。响应主体长度也指定如下。如果响应长度参数大于zero,这将指定要发送的确切字节数,并且应用程序必须发送该确切数量的数据。如果响应长度参数是zero,则使用分块传输编码并且可以发送任意数量的数据。应用程序通过关闭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
从表单中的请求返回协议字符串协议/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,如果没有变化则为nullo- 要设置为该对象的Outputstream或null(如果没有变化)的过滤输出流
-
getPrincipal
- 返回:
HttpPrincipal或null(如果未设置验证器)
-