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.
HttpRequest
Klassen 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 Path
den 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 InputStream
til 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.