3.1 Editores del cuerpo

Espero que no haya olvidado que además de las solicitudes GET , también hay solicitudes PUT y POST , cuando también necesita agregar a la solicitud , es decir, el cuerpo de la solicitud.request body

HttpRequestLa clase tiene una clase interna especial para esto BodyPublisher. Aunque técnicamente es una interfaz que tiene múltiples implementaciones, de las cuales hablaremos a continuación

Y comenzaremos con lo más simple: la ausencia de un cuerpo de solicitud. Sí, sucede.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.noBody())
   .build();

Sencillo y hermoso.

3.2 de Cadena()

La segunda opción más común es pasar alguna cadena como cuerpo de la solicitud. Esto se hace de manera muy simple:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "text/plain;charset=UTF-8")
   .POST(HttpRequest.BodyPublishers.ofString("Hello"))
   .build();

Por cierto, puede configurar la codificación de la cadena transmitida. Puede ser muy útil si el servidor http al que se envía la solicitud no funciona en UTF8.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
   .build();

3.3 deArchivo()

Finalmente, es posible que desee adjuntar un archivo a la solicitud POST . Así es como normalmente se suben tus avatares al servidor. Para hacer esto, debe llamar al método ofFile(), donde transferir Pathel archivo local:


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 de ByteArray()

Otro escenario común es enviar un conjunto de bytes al servidor. Por ejemplo, serializó algún objeto como un conjunto de bytes, encriptó algo o simplemente desea enviar algún búfer de datos. Esto requiere un método .ofByteArray().

Este método toma una matriz de bytes como parámetro. Ejemplo:


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 de InputStream()

Finalmente, el último pero no menos interesante escenario es adjuntar InputStreama una solicitud POST .

Hay una función especial para esto ofInputStream(). Y ella es muy inteligente. Le permite organizar la transferencia de datos de un flujo a otro, adjuntar un flujo de datos a una solicitud de POS que aún no está abierta.

Debe pasar una función a la función ofInputStream(), que devolverá un flujo como resultado InputStream.

Ejemplo:


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();

No me molesté en cercar el jardín aquí, pero creo que entiendes el principio. ¿Por qué hicieron eso? Casi siempre puedes usar el ofByteArray(). Pero si desea enviar datos de forma asíncrona o necesita implementar algún escenario particularmente complejo, entonces puede usar este método.