类 HttpExchange

java.lang.Object
com.sun.net.httpserver.HttpExchange
所有已实现的接口:
Request , AutoCloseable
已知子类:
HttpsExchange

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

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

  1. getRequestMethod() 确定命令。
  2. getRequestHeaders() 检查请求标头(如果需要)。
  3. getRequestBody() 返回一个 InputStream 用于读取请求正文。读取请求正文后,应关闭流。
  4. getResponseHeaders() 设置任何响应标头,内容长度除外。
  5. sendResponseHeaders(int,long) 发送响应标头。必须在下一步之前调用。
  6. getResponseBody() 获取 OutputStream 以发送响应正文。写入响应主体后,必须关闭流以终止交换。
终止交换
当请求 InputStream 和响应 OutputStream 都关闭时,交换终止。关闭 OutputStream ,隐式关闭 InputStream (如果它尚未关闭)。但是,建议在关闭之前消耗掉 InputStream 中的所有数据。便捷方法 close() 完成所有这些任务。在不消耗所有请求主体的情况下关闭交换不是错误,但可能会使底层 TCP 连接无法用于后续交换。无法终止交换的影响是不确定的,但通常会导致资源无法被释放/重用。
自从:
1.6
  • 构造方法详细信息

    • HttpExchange

      protected HttpExchange()
      子类调用的构造方法。
  • 方法详情

    • getRequestHeaders

      public abstract Headers  getRequestHeaders()
      返回一个不可变的 Headers ,其中包含此请求中包含的 HTTP 标头。

      Headers 中的键是标头名称,而值是 List 字符串 包含请求中包含的每个值,按它们包含的顺序排列。多次出现的标题字段表示为多个字符串值。

      Headers 中的键不区分大小写。

      指定者:
      getRequestHeaders 在接口 Request
      返回:
      一个只读的 Headers 可用于访问请求标头。
    • getResponseHeaders

      public abstract Headers  getResponseHeaders()
      返回一个可变的 Headers ,其中可以存储 HTTP 响应标头,并将作为此响应的一部分传输。

      Headers 中的键是标头名称,而值必须是 List 字符串 包含应多次包含的每个值(按照应包含的顺序)。

      Headers 中的键不区分大小写。

      返回:
      可写的 Headers 可用于设置响应标头。
    • getRequestURI

      public abstract URI  getRequestURI()
      返回请求 URI
      指定者:
      getRequestURI 在接口 Request
      返回:
      请求URI
    • getRequestMethod

      public abstract String  getRequestMethod()
      返回请求方法。
      指定者:
      getRequestMethod 在接口 Request
      返回:
      请求方法字符串
    • getHttpContext

      public abstract HttpContext  getHttpContext()
      返回此交换的 HttpContext
      返回:
      HttpContext
    • close

      public abstract void close()
      通过按顺序执行以下操作来结束此交换:
      1. 关闭请求 InputStream ,如果尚未关闭。
      2. 关闭响应 OutputStream ,如果尚未关闭。
      指定者:
      close 在接口 AutoCloseable
    • getRequestBody

      public abstract InputStream  getRequestBody()
      返回一个流,可以从中读取请求正文。多次调用此方法将返回相同的流。建议应用程序在关闭该流之前使用(读取)该流中的所有数据。如果在读取所有数据之前关闭流,则 InputStream.close() 调用将读取并丢弃剩余数据(最多达到特定于实现的字节数)。
      返回:
      可以从中读取请求主体的流
    • getResponseBody

      public abstract OutputStream  getResponseBody()
      返回必须写入响应主体的流。 sendResponseHeaders(int,long) ) 必须在调用此方法之前调用。多次调用此方法(针对同一交换)将返回相同的流。为了正确终止每个交换,必须关闭输出流,即使没有发送响应主体也是如此。

      关闭此流会隐式关闭从 getRequestBody() 返回的 InputStream (如果它尚未关闭)。

      如果对 sendResponseHeaders(int, long) 的调用指定了固定的响应主体长度,则必须将该调用中指定的确切字节数写入此流。如果写入的字节太多,OutputStream 的 write 方法将抛出 IOException。如果写入的字节太少,则流 OutputStream.close() 将抛出 IOException。在这两种情况下,交换都会中止并且底层 TCP 连接会关闭。

      返回:
      写入响应主体的流
    • sendResponseHeaders

      public abstract void sendResponseHeaders(int rCode, long responseLength) throws IOException
      开始使用当前的响应标头集和此方法中指定的数字响应代码将响应发送回客户端。响应主体长度也指定如下。如果响应长度参数大于 zero ,这将指定要发送的确切字节数,并且应用程序必须发送该确切数量的数据。如果响应长度参数是 zero ,则使用分块传输编码并且可以发送任意数量的数据。应用程序通过关闭 OutputStream 来终止响应主体。如果响应长度的值为 -1,则不发送任何响应主体。

      如果尚未设置内容长度响应标头,则根据响应长度参数将其设置为适当的值。

      必须在调用 getResponseBody() 之前调用此方法。

      实现注意事项:
      此实现允许调用者指示服务在交换终止后强制关闭连接,方法是在调用 sendResponseHeaders 之前向 响应头 提供 Connection: close 标头。
      参数:
      rCode - 要发送的响应代码
      responseLength - 如果 > 0,则指定固定的响应主体长度,并且必须将确切的字节数写入从 getResponseCode() 获取的流中。如果 == 0,则使用分块编码,并且可以写入任意数量的字节。如果 <= -1,则不指定响应主体长度,也不会写入响应主体。
      抛出:
      IOException - 如果响应标头已经发送或发生 I/O 错误
      参见:
    • 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)
      Filter 模块可以使用 HttpExchange 实例存储任意对象作为带外通信机制。然后其他过滤器或交换处理程序可以访问这些对象。

      每个 Filter 类都将记录它们提供的属性。

      参数:
      name - 要检索的属性的名称
      返回:
      属性对象,或者 null 如果它不存在
      抛出:
      NullPointerException - 如果名字是 null
    • setAttribute

      public abstract void setAttribute(String  name, Object  value)
      Filter 模块可以使用 HttpExchange 实例存储任意对象作为带外通信机制。然后其他过滤器或交换处理程序可以访问这些对象。

      每个 Filter 类都将记录它们提供的属性。

      参数:
      name - 与属性值关联的名称
      value - 作为属性值存储的对象。 null 值是允许的。
      抛出:
      NullPointerException - 如果名字是 null
    • setStreams

      public abstract void setStreams(InputStream  i, OutputStream  o)
      过滤器 使用此交换器的 InputStream OutputStream 之一(或两者),使用给定的过滤流,以便后续对 getRequestBody() 的调用将返回给定的 InputStream ,对 getResponseBody() 的调用将返回给定的 OutputStream 。提供给此调用的流必须包装原始流,并且可以是(但不一定是)FilterInputStream FilterOutputStream 的子类。
      参数:
      i - 过滤后的输入流设置为这个对象的 Inputstream ,如果没有变化则为 null
      o - 要设置为该对象的 Outputstreamnull(如果没有变化)的过滤输出流
    • getPrincipal

      public abstract HttpPrincipal  getPrincipal()
      如果在拥有此交换的 HttpContext 上设置了身份验证器,则此方法将返回代表此 HttpExchange 的经过身份验证的用户的 HttpPrincipal
      返回:
      HttpPrincipalnull(如果未设置验证器)