3.1 Body Publishers
Jeg håber ikke, du har glemt, at der udover GET-anmodninger også er PUT- og POST-anmodninger , når du også skal tilføje til anmodningen request body
, det vil sige anmodningslegemet.
HttpRequest
Klassen har en særlig indre klasse til dette BodyPublisher
. Selvom det teknisk set er en grænseflade, der har flere implementeringer, som vi vil diskutere nedenfor
Og vi starter med det enkleste - fraværet af et anmodningsorgan. Ja, det sker.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
Enkelt og smukt.
3.2 ofString()
Den næstmest almindelige mulighed er at sende en streng som forespørgselstekst. Dette gøres meget 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 kan du indstille kodningen af den transmitterede streng. Det kan være meget nyttigt, hvis http-serveren, som anmodningen sendes til, ikke virker på UTF8.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
.build();
3.3 af Fil()
Til sidst vil du måske vedhæfte en fil til POST-anmodningen . Sådan uploades dine avatarer normalt til serveren. For at gøre dette skal du kalde metoden ofFile()
, hvor Path
den lokale fil skal overføres:
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 andet almindeligt scenarie er at sende et sæt bytes til serveren. For eksempel har du serialiseret et objekt som et sæt bytes, krypteret noget eller bare vil sende en databuffer. Dette kræver en metode .ofByteArray()
.
Denne metode tager et array af bytes 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 afInputStream()
Endelig er det sidste, men ikke mindst interessante scenarie knyttet InputStream
til en POST-anmodning .
Der er en speciel funktion til dette ofInputStream()
. Og hun er meget klog. Det giver dig mulighed for at organisere overførslen af data fra strøm til strøm, vedhæfte en datastrøm til en POS-anmodning , der ikke engang er åben endnu.
Du skal videregive en funktion til funktionen ofInputStream()
, som vil returnere en stream 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 gad ikke indhegne haven her, men jeg tror du forstår princippet. Hvorfor gjorde de det? Du kan næsten altid bruge ofByteArray()
. Men hvis du vil sende data asynkront, eller du skal implementere et særligt komplekst scenarie, kan du bruge denne metode.
GO TO FULL VERSION