java.lang.Object
java.net.http.HttpRequest.BodyPublishers
- 封装类:
-
HttpRequest
实现了
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 Summary
Modifier and TypeMethodDescriptionstatic HttpRequest.BodyPublisher
concat
(HttpRequest.BodyPublisher... publishers) 返回一个BodyPublisher
,它发布由一系列发布者发布的请求体的连接。static HttpRequest.BodyPublisher
fromPublisher
(Flow.Publisher<? extends ByteBuffer> publisher) 返回一个请求体发布者,其主体从给定的Flow.Publisher
中检索。static HttpRequest.BodyPublisher
fromPublisher
(Flow.Publisher<? extends ByteBuffer> publisher, long contentLength) 返回一个请求体发布者,其主体从给定的Flow.Publisher
中检索。static HttpRequest.BodyPublisher
noBody()
一个不发送请求体的请求体发布者。static HttpRequest.BodyPublisher
ofByteArray
(byte[] buf) 返回一个请求体发布者,其主体为给定的字节数组。static HttpRequest.BodyPublisher
ofByteArray
(byte[] buf, int offset, int length) 返回一个请求体发布者,其主体为从指定offset
开始的length
字节的给定字节数组的内容。static HttpRequest.BodyPublisher
ofByteArrays
(Iterable<byte[]> iter) 一个从字节数组的Iterable
中获取数据的请求体发布者。static HttpRequest.BodyPublisher
一个从文件内容中获取数据的请求体发布者。static HttpRequest.BodyPublisher
ofInputStream
(Supplier<? extends InputStream> streamSupplier) 一个从InputStream
中读取数据的请求体发布者。static HttpRequest.BodyPublisher
返回一个请求体发布者,其主体为给定的String
,使用UTF_8
字符集转换。static HttpRequest.BodyPublisher
返回一个请求体发布者,其主体为给定的String
,使用给定的字符集转换。
-
Method Details
-
fromPublisher
public static HttpRequest.BodyPublisher fromPublisher(Flow.Publisher<? extends ByteBuffer> publisher) 返回一个请求体发布者,其主体从给定的Flow.Publisher
中检索。返回的请求体发布者具有未知的内容长度。- API 注释:
-
此方法可用作
BodyPublisher
和Flow.Publisher
之间的适配器,其中发布者将发布的请求体量是未知的。 - 参数:
-
publisher
- 负责发布主体的发布者 - 返回:
- 一个BodyPublisher
-
fromPublisher
public static HttpRequest.BodyPublisher fromPublisher(Flow.Publisher<? extends ByteBuffer> publisher, long contentLength) 返回一个请求体发布者,其主体从给定的Flow.Publisher
中检索。返回的请求体发布者具有给定的内容长度。给定的
contentLength
是一个正数,表示publisher
必须发布的确切字节数量。- API 注释:
-
此方法可用作
BodyPublisher
和Flow.Publisher
之间的适配器,其中发布者将发布的请求体量是已知的。 - 参数:
-
publisher
- 负责发布主体的发布者 -
contentLength
- 表示发布者将发布的确切字节数量的正数 - 返回:
- 一个BodyPublisher
- 抛出:
-
IllegalArgumentException
- 如果内容长度为非正数
-
ofString
返回一个请求体发布者,其主体为给定的String
,使用UTF_8
字符集转换。- 参数:
-
body
- 包含主体的字符串 - 返回:
- 一个BodyPublisher
-
ofString
返回一个请求体发布者,其主体为给定的String
,使用给定的字符集转换。- 参数:
-
s
- 包含主体的字符串 -
charset
- 将字符串转换为字节的字符集 - 返回:
- 一个BodyPublisher
-
ofInputStream
public static HttpRequest.BodyPublisher ofInputStream(Supplier<? extends InputStream> streamSupplier) 从InputStream
中读取数据的请求体发布者。在需要重复请求时,使用InputStream
的Supplier
,因为内容未缓冲。在后续尝试中,Supplier
可能返回null
,在这种情况下请求将失败。- 参数:
-
streamSupplier
- 供应开放的InputStream的Supplier - 返回:
- 一个BodyPublisher
-
ofByteArray
返回一个请求体发布者,其主体为给定的字节数组。- 参数:
-
buf
- 包含主体的字节数组 - 返回:
- 一个BodyPublisher
-
ofByteArray
返回一个请求体发布者,其主体为从指定offset
开始的length
字节的给定字节数组的内容。- 参数:
-
buf
- 包含主体的字节数组 -
offset
- 第一个字节的偏移量 -
length
- 要使用的字节数 - 返回:
- 一个BodyPublisher
- 抛出:
-
IndexOutOfBoundsException
- 如果子范围被定义为超出范围
-
ofFile
从文件内容中获取数据的请求体发布者。在创建
BodyPublisher
时,将执行安全管理器权限检查。必须注意不要将BodyPublisher
与不受信任的代码共享。- 参数:
-
path
- 包含主体的文件的路径 - 返回:
- 一个BodyPublisher
- 抛出:
-
FileNotFoundException
- 如果找不到路径 -
SecurityException
- 如果拒绝读取文件:在系统默认文件系统提供程序的情况下,并且安装了安全管理器,则会调用checkRead
来检查对给定文件的读取访问权限
-
ofByteArrays
从Iterable
的字节数组中获取数据的请求体发布者。提供了一个提供Iterator
实例的Iterable
。每次尝试发送请求都会调用一次Iterable
。- 参数:
-
iter
- 一个字节数组的Iterable - 返回:
- 一个BodyPublisher
-
noBody
一个不发送请求体的请求体发布者。- 返回:
- 一个立即完成且不发送请求体的BodyPublisher。
-
concat
返回一个BodyPublisher
,它发布一个请求体,该请求体由一系列发布者发布的请求体串联而成。如果序列为空,则返回一个空发布者。否则,如果序列包含一个元素,则返回该发布者。否则返回一个串联发布者。
由串联发布者发布的请求体在逻辑上等同于按顺序串联每个发布者的所有字节后发布的请求体。
每个发布者都会被延迟订阅,直到所有的请求体字节被发布、发生错误,或者串联发布者的订阅被取消。串联发布者可能被订阅多次,这可能导致序列中的发布者被订阅多次。
只有当序列中的所有发布者都具有已知的内容长度时,串联发布者才具有已知的内容长度。串联发布者报告的
contentLength
的计算如下:- 如果任何发布者报告未知的内容长度,或者已知内容长度的总和超过
Long.MAX_VALUE
,则结果内容长度为未知。 - 否则,结果内容长度为已知内容长度的总和,一个介于
0
和Long.MAX_VALUE
之间的数字,包括这两个值。
- 实现注意事项:
- 如果串联发布者的订阅被取消,或者在发布字节时发生错误,则可能不会订阅序列中的所有发布者。
- 参数:
-
publishers
- 一系列发布者。 - 返回:
- 一个聚合发布者,发布一个逻辑上等同于序列中每个发布者发布的所有字节串联的请求体。
- 自:
- 16
- 如果任何发布者报告未知的内容长度,或者已知内容长度的总和超过
-