3.1 Körperverleger

Ich hoffe, Sie haben nicht vergessen, dass es neben GET-Anfragen auch PUT- und POST-Anfragen gibt , bei denen Sie auch der Anfrage request body, also dem Anfragetext, etwas hinzufügen müssen .

Die Klasse verfügt hierfür HttpRequestüber eine spezielle innere Klasse BodyPublisher. Obwohl es sich technisch gesehen um eine Schnittstelle mit mehreren Implementierungen handelt, werden wir weiter unten darauf eingehen

Und wir beginnen mit dem Einfachsten – dem Fehlen eines Anfragetextes. Ja, es passiert.


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

Einfach und schön.

3.2 ofString()

Die zweithäufigste Option besteht darin, eine Zeichenfolge als Anforderungstext zu übergeben. Das geht ganz einfach:


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

Übrigens können Sie die Kodierung des übertragenen Strings einstellen. Dies kann sehr nützlich sein, wenn der HTTP-Server, an den die Anfrage gesendet wird, nicht mit UTF8 funktioniert.


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

3.3 ofFile()

Abschließend möchten Sie möglicherweise eine Datei an die POST-Anfrage anhängen . Auf diese Weise werden Ihre Avatare normalerweise auf den Server hochgeladen. Dazu müssen Sie die Methode aufrufen ofFile(), wohin Pathdie lokale Datei übertragen werden soll:


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

Ein weiteres häufiges Szenario besteht darin, eine Reihe von Bytes an den Server zu senden. Sie haben beispielsweise ein Objekt als Satz von Bytes serialisiert, etwas verschlüsselt oder möchten einfach nur einen Datenpuffer senden. Dies erfordert eine Methode .ofByteArray().

Diese Methode verwendet ein Byte-Array als Parameter. Beispiel:


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

Das letzte, aber nicht zuletzt interessante Szenario ist das Anhängen InputStreaman eine POST-Anfrage .

Hierfür gibt es eine spezielle Funktion ofInputStream(). Und sie ist sehr schlau. Es ermöglicht Ihnen, die Übertragung von Daten von Stream zu Stream zu organisieren und einen Datenstream an eine POS-Anfrage anzuhängen , die noch nicht einmal geöffnet ist.

Sie müssen eine Funktion an die Funktion übergeben ofInputStream(), die als Ergebnis einen Stream zurückgibt InputStream.

Beispiel:


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

Ich habe mir hier nicht die Mühe gemacht, den Garten einzuzäunen, aber ich denke, Sie verstehen das Prinzip. Warum haben sie das getan? Sie können fast immer die verwenden ofByteArray(). Wenn Sie jedoch Daten asynchron senden möchten oder ein besonders komplexes Szenario implementieren müssen, können Sie diese Methode verwenden.