Module  jdk.httpserver

Class HttpExchange

  • 已知直接子类:
    HttpsExchange


    public abstract class HttpExchange
    extends Object
    此类封装了收到的HTTP请求和在一个交换中生成的响应。 它提供了从客户端检查请求以及构建和发送响应的方法。

    HttpExchange的典型生命周期如下所示。

    1. getRequestMethod()来确定命令
    2. getRequestHeaders()检查请求标头(如果需要)
    3. getRequestBody()返回InputStream读取请求体。 读取请求正文后,流即将关闭。
    4. getResponseHeaders()设置任何响应头,除了content-length
    5. sendResponseHeaders(int,long)发送响应头。 必须在下一步之前调用。
    6. getResponseBody()得到一个OutputStream发送响应体。 当响应体被写入时,流必须关闭才能终止交换。
    终止交流
    当请求InputStream和响应OutputStream都关闭时,交换终止。 关闭OutputStream,隐式关闭InputStream(如果尚未关闭)。 但是,建议您在关闭之前从InputStream中使用所有数据。 便利方法close()执行所有这些任务。 关闭交换而不占用所有请求主体不是错误,但可能使基础TCP连接不可用于以下交换。 未能终止交换的效果未定义,但通常会导致资源无法被释放/重用。
    从以下版本开始:
    1.6
    • 构造方法详细信息

      • HttpExchange

        protected HttpExchange​()
    • 方法详细信息

      • 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​()
        按顺序完成此交换:
        1. 关闭请求InputStream,如果尚未关闭;
        2. 关闭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 提供给此呼叫的流必须包装原始流,并且可能是(但不是必须的) FilterInputStreamFilterOutputStream子类。
        参数
        i - 被过滤的输入流设置为此对象的输入流,如果没有更改, null
        o - 过滤后的输出流设置为此对象的输出流,如果没有更改 null
      • getPrincipal

        public abstract HttpPrincipal getPrincipal​()
        如果认证被设置在拥有这种交换的HttpContext,则此方法将返回HttpPrincipal ,表示此HttpExchange身份验证的用户。
        结果
        the HttpPrincipal, or null if no authenticator is set.