Module java.net.http
Package java.net.http

Class HttpRequest.BodyPublishers

java.lang.Object
java.net.http.HttpRequest.BodyPublishers
封装类:
HttpRequest

public static class HttpRequest.BodyPublishers extends Object
实现了BodyPublisher的各种有用的发布者,例如从字符串或文件发布请求体。

以下是使用预定义的body publishers将常见的高级Java对象转换为适合作为请求体发送的数据流的示例:

// 从字符串创建请求体
HttpRequest request = HttpRequest.newBuilder()
     .uri(URI.create("https://foo.com/"))
     .header("Content-Type", "text/plain; charset=UTF-8")
     .POST(BodyPublishers.ofString("some body text"))
     .build();
// 从文件创建请求体
HttpRequest request = HttpRequest.newBuilder()
     .uri(URI.create("https://foo.com/"))
     .header("Content-Type", "application/json")
     .POST(BodyPublishers.ofFile(Paths.get("file.json")))
     .build();
// 从字节数组创建请求体
HttpRequest request = HttpRequest.newBuilder()
     .uri(URI.create("https://foo.com/"))
     .POST(BodyPublishers.ofByteArray(new byte[] { ... }))
     .build();
自 JDK 版本:
11
  • Method Details

    • fromPublisher

      public static HttpRequest.BodyPublisher fromPublisher(Flow.Publisher<? extends ByteBuffer> publisher)
      返回一个请求体发布者,其主体从给定的Flow.Publisher中检索。返回的请求体发布者具有未知的内容长度。
      API 注释:
      此方法可用作BodyPublisherFlow.Publisher之间的适配器,其中发布者将发布的请求体量是未知的。
      参数:
      publisher - 负责发布主体的发布者
      返回:
      一个BodyPublisher
    • fromPublisher

      public static HttpRequest.BodyPublisher fromPublisher(Flow.Publisher<? extends ByteBuffer> publisher, long contentLength)
      返回一个请求体发布者,其主体从给定的Flow.Publisher中检索。返回的请求体发布者具有给定的内容长度。

      给定的contentLength是一个正数,表示publisher必须发布的确切字节数量。

      API 注释:
      此方法可用作BodyPublisherFlow.Publisher之间的适配器,其中发布者将发布的请求体量是已知的。
      参数:
      publisher - 负责发布主体的发布者
      contentLength - 表示发布者将发布的确切字节数量的正数
      返回:
      一个BodyPublisher
      抛出:
      IllegalArgumentException - 如果内容长度为非正数
    • ofString

      public static HttpRequest.BodyPublisher ofString(String body)
      返回一个请求体发布者,其主体为给定的String,使用UTF_8字符集转换。
      参数:
      body - 包含主体的字符串
      返回:
      一个BodyPublisher
    • ofString

      public static HttpRequest.BodyPublisher ofString(String s, Charset charset)
      返回一个请求体发布者,其主体为给定的String,使用给定的字符集转换。
      参数:
      s - 包含主体的字符串
      charset - 将字符串转换为字节的字符集
      返回:
      一个BodyPublisher
    • ofInputStream

      public static HttpRequest.BodyPublisher ofInputStream(Supplier<? extends InputStream> streamSupplier)
      InputStream中读取数据的请求体发布者。在需要重复请求时,使用InputStreamSupplier,因为内容未缓冲。在后续尝试中,Supplier可能返回null,在这种情况下请求将失败。
      参数:
      streamSupplier - 供应开放的InputStream的Supplier
      返回:
      一个BodyPublisher
    • ofByteArray

      public static HttpRequest.BodyPublisher ofByteArray(byte[] buf)
      返回一个请求体发布者,其主体为给定的字节数组。
      参数:
      buf - 包含主体的字节数组
      返回:
      一个BodyPublisher
    • ofByteArray

      public static HttpRequest.BodyPublisher ofByteArray(byte[] buf, int offset, int length)
      返回一个请求体发布者,其主体为从指定offset开始的length字节的给定字节数组的内容。
      参数:
      buf - 包含主体的字节数组
      offset - 第一个字节的偏移量
      length - 要使用的字节数
      返回:
      一个BodyPublisher
      抛出:
      IndexOutOfBoundsException - 如果子范围被定义为超出范围
    • ofFile

      public static HttpRequest.BodyPublisher ofFile(Path path) throws FileNotFoundException
      从文件内容中获取数据的请求体发布者。

      在创建BodyPublisher时,将执行安全管理器权限检查。必须注意不要将BodyPublisher与不受信任的代码共享。

      参数:
      path - 包含主体的文件的路径
      返回:
      一个BodyPublisher
      抛出:
      FileNotFoundException - 如果找不到路径
      SecurityException - 如果拒绝读取文件:在系统默认文件系统提供程序的情况下,并且安装了安全管理器,则会调用checkRead来检查对给定文件的读取访问权限
    • ofByteArrays

      public static HttpRequest.BodyPublisher ofByteArrays(Iterable<byte[]> iter)
      Iterable的字节数组中获取数据的请求体发布者。提供了一个提供Iterator实例的Iterable。每次尝试发送请求都会调用一次Iterable
      参数:
      iter - 一个字节数组的Iterable
      返回:
      一个BodyPublisher
    • noBody

      public static HttpRequest.BodyPublisher noBody()
      一个不发送请求体的请求体发布者。
      返回:
      一个立即完成且不发送请求体的BodyPublisher。
    • concat

      public static HttpRequest.BodyPublisher concat(HttpRequest.BodyPublisher... publishers)
      返回一个BodyPublisher,它发布一个请求体,该请求体由一系列发布者发布的请求体串联而成。

      如果序列为空,则返回一个发布者。否则,如果序列包含一个元素,则返回该发布者。否则返回一个串联发布者

      串联发布者发布的请求体在逻辑上等同于按顺序串联每个发布者的所有字节后发布的请求体。

      每个发布者都会被延迟订阅,直到所有的请求体字节被发布、发生错误,或者串联发布者的订阅被取消。串联发布者可能被订阅多次,这可能导致序列中的发布者被订阅多次。

      只有当序列中的所有发布者都具有已知的内容长度时,串联发布者才具有已知的内容长度。串联发布者报告的contentLength的计算如下:

      • 如果任何发布者报告未知的内容长度,或者已知内容长度的总和超过Long.MAX_VALUE,则结果内容长度为未知
      • 否则,结果内容长度为已知内容长度的总和,一个介于0Long.MAX_VALUE之间的数字,包括这两个值。
      实现注意事项:
      如果串联发布者的订阅被取消,或者在发布字节时发生错误,则可能不会订阅序列中的所有发布者。
      参数:
      publishers - 一系列发布者。
      返回:
      一个聚合发布者,发布一个逻辑上等同于序列中每个发布者发布的所有字节串联的请求体。
      自:
      16