3.1 主体发布者
希望你没有忘记,除了GET请求,还有PUT和POST请求,这时你还需要在请求中添加request body
,也就是请求体。
该类为此HttpRequest
有一个特殊的内部类BodyPublisher
。虽然它在技术上是一个具有多种实现的接口,我们将在下面讨论
我们将从最简单的开始 - 没有请求主体。是的,它发生了。
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
简单而美丽。
3.2 ofString()
第二个最常见的选项是将一些字符串作为请求正文传递。这非常简单:
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", "text/plain;charset=UTF-8")
.POST(HttpRequest.BodyPublishers.ofString("Hello"))
.build();
顺便说一句,你可以设置传输字符串的编码。如果请求发送到的 http 服务器不能在 UTF8 上工作,它会非常有用。
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
.build();
3.3 ofFile()
最后,您可能希望将文件附加到POST 请求。这就是您的头像通常上传到服务器的方式。为此,您需要调用方法,将本地文件ofFile()
传输到哪里:Path
Path avatar = Path.of("c://avatar.jpeg");
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", "image/jpeg")
.POST(HttpRequest.BodyPublishers.ofFile(avatar))
.build();
3.4 ofByteArray()
另一种常见的情况是向服务器发送一组字节。例如,您将一些对象序列化为一组字节、加密了一些东西,或者只是想发送一些数据缓冲区。这需要一个方法.ofByteArray()
。
此方法将字节数组作为参数。例子:
byte[] data = "My Secret Message".getBytes();
byte[] dataEncripted = SuperEncriptor.encript(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", "application/octet-stream")
.POST(HttpRequest.BodyPublishers.ofByteArray(dataEncripted))
.build();
3.5 ofInputStream()
最后,最后但并非最不重要的场景是附加InputStream
到POST 请求。
为此有一个特殊的功能ofInputStream()
。而且她很聪明。它允许您组织流与流之间的数据传输,将数据流附加到甚至尚未打开的POS 请求。
您需要将一个函数传递给该函数ofInputStream()
,该函数将返回一个流作为结果InputStream
。
例子:
byte[] data = "My Secret Message".getBytes();
//wrapping an array of bytes into a stream.
InputStream is = new ByteArrayInputStream(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", "application/octet-stream")
.POST(HttpRequest.BodyPublishers.ofInputStream (() -> is;))
.build();
我没有费心把这里的花园围起来,但我想你明白其中的原理。他们为什么这样做?您几乎总是可以使用ofByteArray()
. 但是如果你想异步发送数据或者你需要实现一些特别复杂的场景,那么你可以使用这个方法。
GO TO FULL VERSION