3.1 Body Publishers

Jeg håper du ikke har glemt at i tillegg til GET-forespørsler , er det også PUT- og POST-forespørsler , når du også må legge til forespørselen request body, det vil si forespørselskroppen.

HttpRequestKlassen har en egen indre klasse for dette BodyPublisher. Selv om det teknisk sett er et grensesnitt som har flere implementeringer, som vi vil diskutere nedenfor

Og vi starter med det enkleste - fraværet av et forespørselsorgan. Ja, det skjer.


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

Enkelt og vakkert.

3.2 ofString()

Det nest vanligste alternativet er å sende en streng som forespørselstekst. Dette gjøres veldig 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();

Forresten, du kan stille inn kodingen av den overførte strengen. Det kan være veldig nyttig hvis http-serveren som forespørselen sendes til ikke fungerer på UTF8.


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

3.3 ofFile()

Til slutt kan det være lurt å legge ved en fil til POST-forespørselen . Dette er hvordan avatarene dine vanligvis lastes opp til serveren. For å gjøre dette, må du ringe metoden ofFile(), hvor du skal overføre Pathden lokale 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()

Et annet vanlig scenario er å sende et sett med byte til serveren. For eksempel har du serialisert et objekt som et sett med byte, kryptert noe, eller bare ønsker å sende en databuffer. Dette krever en metode .ofByteArray().

Denne metoden tar en rekke byte som en parameter. Eksempel:


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

Til slutt, det siste, men ikke minst interessante scenariet, er knyttet InputStreamtil en POST-forespørsel .

Det er en spesiell funksjon for dette ofInputStream(). Og hun er veldig smart. Den lar deg organisere overføringen av data fra strøm til strøm, knytte en datastrøm til en POS-forespørsel som ikke engang er åpen ennå.

Du må sende en funksjon til funksjonen ofInputStream(), som vil returnere en strøm som et resultat InputStream.

Eksempel:


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

Jeg gadd ikke å gjerde hagen her, men jeg tror du forstår prinsippet. Hvorfor gjorde de det? Du kan nesten alltid bruke ofByteArray(). Men hvis du vil sende data asynkront eller du trenger å implementere et spesielt komplekst scenario, kan du bruke denne metoden.