- java.lang.Object
-
- com.sun.net.httpserver.HttpExchange
-
- 已知直接子类:
-
HttpsExchange
public abstract class HttpExchange extends Object
此类封装了收到的HTTP请求和在一个交换中生成的响应。 它提供了从客户端检查请求以及构建和发送响应的方法。HttpExchange的典型生命周期如下所示。
-
getRequestMethod()
来确定命令 -
getRequestHeaders()
检查请求标头(如果需要) -
getRequestBody()
返回InputStream
读取请求体。 读取请求正文后,流即将关闭。 -
getResponseHeaders()
设置任何响应头,除了content-length -
sendResponseHeaders(int,long)
发送响应头。 必须在下一步之前调用。 -
getResponseBody()
得到一个OutputStream
发送响应体。 当响应体被写入时,流必须关闭才能终止交换。
当请求InputStream和响应OutputStream都关闭时,交换终止。 关闭OutputStream,隐式关闭InputStream(如果尚未关闭)。 但是,建议您在关闭之前从InputStream中使用所有数据。 便利方法close()
执行所有这些任务。 关闭交换而不占用所有请求主体不是错误,但可能使基础TCP连接不可用于以下交换。 未能终止交换的效果未定义,但通常会导致资源无法被释放/重用。- 从以下版本开始:
- 1.6
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
HttpExchange()
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 abstract void
close()
通过按顺序执行以下操作来结束此交换:关闭请求InputStream(如果尚未关闭) 关闭OutputStream的响应,如果尚未关闭。abstract Object
getAttribute(String name)
过滤器模块可以将具有HttpExchange实例的任意对象存储为带外通信机制。abstract HttpContext
getHttpContext()
获取此交换的HttpContextabstract InetSocketAddress
getLocalAddress()
返回接收请求的本地地址abstract HttpPrincipal
getPrincipal()
如果认证被设置在拥有这种交换的HttpContext,则此方法将返回HttpPrincipal
,表示此HttpExchange身份验证的用户。abstract String
getProtocol()
从请求中以 协议/ majorVersion.minorVersion的形式返回协议串。abstract InetSocketAddress
getRemoteAddress()
返回调用此请求的远程实体的地址abstract InputStream
getRequestBody()
返回可以从中读取请求主体的流。abstract Headers
getRequestHeaders()
返回包含此请求中包含的HTTP标头的不可变地图。abstract String
getRequestMethod()
获取请求方法abstract URI
getRequestURI()
获取请求URIabstract OutputStream
getResponseBody()
返回响应主体必须写入的流。abstract int
getResponseCode()
返回响应代码(如果已经设置)abstract Headers
getResponseHeaders()
返回一个可变地图,可以存储HTTP响应标头,哪个将作为此响应的一部分进行传输。abstract void
sendResponseHeaders(int rCode, long responseLength)
开始使用本方法中指定的当前响应头和数字响应代码将响应发送回客户端。abstract void
setAttribute(String name, Object value)
过滤器模块可以将具有HttpExchange实例的任意对象存储为带外通信机制。abstract void
setStreams(InputStream i, OutputStream o)
过滤器使用该包交换器的InputStream和OutputStream(或两者)与给定的过滤流,以便后续调用getRequestBody()
将返回给定的InputStream
,并且调用getResponseBody()
将返回给定的OutputStream
。
-
-
-
方法详细信息
-
getRequestHeaders
public abstract Headers getRequestHeaders()
返回包含此请求中包含的HTTP标头的不可变地图。 该地图中的键将是标题名称,而这些值将是包含每个包含的值的字符串列表(对于多次列出的标题,或者是接受逗号分隔的值列表)单线)。 在这两种情况下,标题名称的值将按照请求中包含的顺序进行显示。地图中的键不区分大小写。
- 结果
- 一个可以用来访问请求头的只读地图
-
getResponseHeaders
public abstract Headers getResponseHeaders()
返回一个可变地图,可以存储HTTP响应标头,哪个将作为此响应的一部分进行传输。 地图中的键将是标题名称,而这些值必须是包含应包含多次(按照它们应包含的顺序)的每个值的字符串列表。地图中的键不区分大小写。
- 结果
- 可写地图,可用于设置响应头。
-
getRequestURI
public abstract URI getRequestURI()
获取请求URI- 结果
- 请求URI
-
getRequestMethod
public abstract String getRequestMethod()
获取请求方法- 结果
- 请求方式
-
getHttpContext
public abstract HttpContext getHttpContext()
获取此交换的HttpContext- 结果
- HttpContext
-
close
public abstract void close()
按顺序完成此交换:- 关闭请求InputStream,如果尚未关闭;
- 关闭OutputStream的响应,如果尚未关闭。
-
getRequestBody
public abstract InputStream getRequestBody()
返回可以从中读取请求主体的流。 对此方法的多次调用将返回相同的流。 建议应用程序在关闭之前消耗(读取)此流中的所有数据。 如果在所有数据被读取之前关闭流,则close()调用将读取并丢弃剩余的数据(达到一个实现特定的字节数)。- 结果
- 可以从中读取请求主体的流。
-
getResponseBody
public abstract OutputStream getResponseBody()
返回响应主体必须写入的流。sendResponseHeaders(int,long)
)必须在调用此方法之前调用。 对此方法的多次调用(对于相同的交换)将返回相同的流。 为了正确地终止每个交换,输出流必须关闭,即使没有发送响应正文。关闭此流隐式关闭从
getRequestBody()
返回的InputStream(如果尚未关闭)。如果对sendResponseHeaders()的调用指定了一个固定的响应体长度,则该调用中指定的确切字节数必须写入此流。 如果写入太多字节,那么write()将抛出一个IOException。 如果写入太少的字节,则流close()将抛出IOException。 在这两种情况下,交换中断,底层TCP连接关闭。
- 结果
- 响应主体被写入的流
-
sendResponseHeaders
public abstract void sendResponseHeaders(int rCode, long responseLength) throws IOException
开始使用本方法中指定的当前响应头和数字响应代码将响应发送回客户端。 响应体长度也如下所述。 如果响应长度参数大于零,则指定要发送的确切字节数,并且应用程序必须发送确切的数据量。 如果响应长度参数是zero
,则使用分块传输编码,并且可以发送任意数量的数据。 应用程序通过关闭OutputStream来终止响应体。 如果响应长度值为-1
则不会发送响应正文。如果内容长度响应头尚未设置,则根据响应长度参数将其设置为适当的值。
在调用
getResponseBody()
之前必须调用此方法。- 参数
-
rCode
- 要发送的响应代码 -
responseLength
- 如果> 0,则指定固定的响应体长度,并且必须将精确的字节数写入从getResponseBody()获取的流中,否则如果等于0,则使用分块编码,并且任意数量的字节可能被写 如果<= -1,则没有指定响应体长度,并且不能写入响应体。 - 异常
-
IOException
- 另请参见:
-
getResponseBody()
-
getRemoteAddress
public abstract InetSocketAddress getRemoteAddress()
返回调用此请求的远程实体的地址- 结果
- 调用者的InetSocketAddress
-
getResponseCode
public abstract int getResponseCode()
返回响应代码(如果已经设置)- 结果
-
响应代码(如果有)。
-1
如果还没有。
-
getLocalAddress
public abstract InetSocketAddress getLocalAddress()
返回接收请求的本地地址- 结果
- 本地接口的InetSocketAddress
-
getProtocol
public abstract String getProtocol()
从请求中以协议/ majorVersion.minorVersion的形式返回协议串。 例如,“HTTP / 1.1”- 结果
- 来自请求的协议串
-
getAttribute
public abstract Object getAttribute(String name)
过滤器模块可以将具有HttpExchange实例的任意对象存储为带外通信机制。 其他过滤器或交换处理程序可能会访问这些对象。每个Filter类都将记录它们可用的属性。
- 参数
-
name
- 要检索的属性的名称 - 结果
- 属性对象,如果不存在,则为null
- 异常
-
NullPointerException
- 如果名字是null
-
setAttribute
public abstract void setAttribute(String name, Object value)
过滤器模块可以将具有HttpExchange实例的任意对象存储为带外通信机制。 其他过滤器或交换处理程序可能会访问这些对象。每个Filter类都将记录它们可用的属性。
- 参数
-
name
- 与属性值关联的名称 -
value
- 存储为属性值的对象。null
值为null
。 - 异常
-
NullPointerException
- 如果名字是null
-
setStreams
public abstract void setStreams(InputStream i, OutputStream o)
过滤器使用该交换的InputStream和OutputStream(或两者)与给定的过滤流,以便后续调用getRequestBody()
将返回给定的InputStream
,并且调用getResponseBody()
将返回给定的OutputStream
。 提供给此呼叫的流必须包装原始流,并且可能是(但不是必须的)FilterInputStream
和FilterOutputStream
的子类。- 参数
-
i
- 被过滤的输入流设置为此对象的输入流,如果没有更改,null
。 -
o
- 过滤后的输出流设置为此对象的输出流,如果没有更改null
。
-
getPrincipal
public abstract HttpPrincipal getPrincipal()
如果认证被设置在拥有这种交换的HttpContext,则此方法将返回HttpPrincipal
,表示此HttpExchange身份验证的用户。- 结果
-
the HttpPrincipal, or
null
if no authenticator is set.
-
-