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
HttpRequest
La 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 Path
el 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 InputStream
a 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.