模块 java.net.http

类 HttpRequest.BodyPublishers

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

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

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

  // Request body from a String
  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();

  // Request body from a File
  HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://foo.com/"))
    .header("Content-Type", "application/json")
    .POST(BodyPublishers.ofFile(Paths.get("file.json")))
    .build();

  // Request body from a byte array
  HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://foo.com/"))
    .POST(BodyPublishers.ofByteArray(new byte[] { ... }))
    .build();  
自从:
11
  • 方法详情

    • 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 - 开放输入流的供应商
      返回:
      一个 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 字节数组中获取数据的请求主体发布者。提供了一个 Iterable 来提供 Iterator 个实例。每次尝试发送请求都会导致调用 Iterable
      参数:
      iter - 字节数组的可迭代对象
      返回:
      一个 BodyPublisher
    • noBody

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

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

      如果序列为空,则返回 empty publisher。否则,如果序列包含单个元素,则返回该发布者。否则返回 concatenation publisher

      concatenation publisher 发布的请求主体在逻辑上等同于通过按顺序连接每个发布者的所有字节发布的请求主体。

      依次对每个发布者进行惰性订阅,直到所有的body bytes都被发布,出现错误,或者串联发布者的订阅被取消。级联发布者可能被订阅多次,这反过来可能导致序列中的发布者被订阅多次。

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

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