java.lang.Object
java.net.http.HttpRequest.BodyPublishers
- 封闭类:
HttpRequest
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
-
方法总结
修饰符和类型方法描述static HttpRequest.BodyPublisherconcat(HttpRequest.BodyPublisher... publishers) 返回一个BodyPublisher,它发布一个请求主体,该请求主体由一系列发布者发布的请求主体的串联组成。static HttpRequest.BodyPublisherfromPublisher(Flow.Publisher<? extends ByteBuffer> publisher) 返回一个请求主体发布者,其主体是从给定的Flow.Publisher中检索到的。static HttpRequest.BodyPublisherfromPublisher(Flow.Publisher<? extends ByteBuffer> publisher, long contentLength) 返回一个请求主体发布者,其主体是从给定的Flow.Publisher中检索到的。static HttpRequest.BodyPublishernoBody()不发送请求正文的请求正文发布者。static HttpRequest.BodyPublisherofByteArray(byte[] buf) 返回一个请求主体发布者,其主体是给定的字节数组。static HttpRequest.BodyPublisherofByteArray(byte[] buf, int offset, int length) 返回一个请求主体发布者,其主体是从指定的offset开始的length字节的给定字节数组的内容。static HttpRequest.BodyPublisherofByteArrays(Iterable<byte[]> iter) 从Iterable字节数组中获取数据的请求主体发布者。static HttpRequest.BodyPublisher从文件内容中获取数据的请求正文发布者。static HttpRequest.BodyPublisherofInputStream(Supplier<? extends InputStream> streamSupplier) 从InputStream读取数据的请求主体发布者。static HttpRequest.BodyPublisher返回请求正文发布者,其正文为给定的String,使用UTF_8字符集转换。static HttpRequest.BodyPublisher返回一个请求主体发布者,其主体是给定的String,使用给定的字符集转换。
-
方法详情
-
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- 开放输入流的供应商- 返回:
- 一个 BodyPublisher
-
ofByteArray
返回一个请求主体发布者,其主体是给定的字节数组。- 参数:
buf- 包含正文的字节数组- 返回:
- 一个 BodyPublisher
-
ofByteArray
返回一个请求主体发布者,其主体是从指定的offset开始的length字节的给定字节数组的内容。- 参数:
buf- 包含正文的字节数组offset- 第一个字节的偏移量length- 要使用的字节数- 返回:
- 一个 BodyPublisher
- 抛出:
IndexOutOfBoundsException- 如果子范围被定义为越界
-
ofFile
从文件内容中获取数据的请求正文发布者。创建
BodyPublisher时,安全管理器权限检查在此工厂方法中执行。必须注意不要与不受信任的代码共享BodyPublisher。- 参数:
path- 包含正文的文件的路径- 返回:
- 一个 BodyPublisher
- 抛出:
FileNotFoundException- 如果找不到路径SecurityException- 如果 打开文件进行阅读 被拒绝:在系统默认文件系统提供程序的情况下,并且安装了安全管理器,调用checkRead来检查对给定文件的读取访问
-
ofByteArrays
- 参数:
iter- 字节数组的可迭代对象- 返回:
- 一个 BodyPublisher
-
noBody
不发送请求正文的请求正文发布者。- 返回:
- 立即完成并且不发送请求正文的 BodyPublisher。
-
concat
返回一个BodyPublisher,它发布一个请求主体,该请求主体由一系列发布者发布的请求主体的串联组成。如果序列为空,则返回 empty publisher。否则,如果序列包含单个元素,则返回该发布者。否则返回 concatenation publisher。
concatenation publisher 发布的请求主体在逻辑上等同于通过按顺序连接每个发布者的所有字节发布的请求主体。
依次对每个发布者进行惰性订阅,直到所有的body bytes都被发布,出现错误,或者串联发布者的订阅被取消。级联发布者可能被订阅多次,这反过来可能导致序列中的发布者被订阅多次。
仅当序列中的所有发布者都具有已知内容长度时,级联发布者才具有已知内容长度。连接发布者报告的
contentLength计算如下:- 如果任何发布者报告 unknown 内容长度,或者如果已知内容长度的总和超过
Long.MAX_VALUE,则生成的内容长度为 unknown 。 - 否则,生成的内容长度是已知内容长度的总和,一个介于
0和Long.MAX_VALUE之间的数字,包括在内。
- 实现注意事项:
- 如果串联发布者的订阅是 取消 ,或者在发布字节时发生错误,则可能不会订阅序列中的所有发布者。
- 参数:
publishers- 一系列发布者。- 返回:
- 发布请求主体的聚合发布者在逻辑上等效于序列中每个发布者发布的所有字节的串联。
- 自从:
- 16
- 如果任何发布者报告 unknown 内容长度,或者如果已知内容长度的总和超过
-