3.1 Body Publishers

Jag hoppas att du inte har glömt att det förutom GET-förfrågningar också finns PUT- och POST-förfrågningar , när du också behöver lägga till förfrågan, request bodydet vill säga förfrågningskroppen.

HttpRequestKlassen har en särskild inre klass för detta BodyPublisher. Även om det tekniskt sett är ett gränssnitt som har flera implementeringar, vilket vi kommer att diskutera nedan

Och vi börjar med det enklaste - frånvaron av ett förfrågningsorgan. Ja, det händer.


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

Enkelt och vackert.

3.2 ofString()

Det näst vanligaste alternativet är att skicka en sträng som förfrågan. Detta görs väldigt enkelt:


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

Förresten, du kan ställa in kodningen för den överförda strängen. Det kan vara mycket användbart om http-servern som begäran skickas till inte fungerar på UTF8.


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

3.3 ofFile()

Slutligen kanske du vill bifoga en fil till POST-begäran . Det är så dina avatarer vanligtvis laddas upp till servern. För att göra detta måste du anropa metoden , ofFile()vart du ska överföra Pathden lokala filen:


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

Ett annat vanligt scenario är att skicka en uppsättning byte till servern. Till exempel, du serialiserade något objekt som en uppsättning byte, krypterade något eller vill bara skicka någon databuffert. Detta kräver en metod .ofByteArray().

Denna metod tar en array av byte som en parameter. Exempel:


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

Slutligen, det sista men inte minst intressanta scenariot är att koppla InputStreamtill en POST-förfrågan .

Det finns en speciell funktion för detta ofInputStream(). Och hon är väldigt smart. Det låter dig organisera överföringen av data från ström till ström, bifoga en dataström till en POS-förfrågan som inte ens är öppen ännu.

Du måste skicka en funktion till funktionen ofInputStream(), vilket kommer att returnera en ström som ett resultat InputStream.

Exempel:


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

Jag brydde mig inte om att inhägna trädgården här, men jag tror att du förstår principen. Varför gjorde de det? Du kan nästan alltid använda ofByteArray(). Men om du vill skicka data asynkront eller om du behöver implementera något särskilt komplext scenario, kan du använda den här metoden.