CodeGym/Java 课程/模块 3/将正文添加到 HttpRequest

将正文添加到 HttpRequest

可用

3.1 主体发布者

希望你没有忘记,除了GET请求,还有PUTPOST请求,这时你还需要在请求中添加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()

最后,最后但并非最不重要的场景是附加InputStreamPOST 请求

为此有一个特殊的功能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(). 但是如果你想异步发送数据或者你需要实现一些特别复杂的场景,那么你可以使用这个方法。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论