3.1 Corpo Editori
Spero che tu non abbia dimenticato che oltre alle richieste GET , ci sono anche richieste PUT e POST , quando devi anche aggiungere alla richiesta , cioè il corpo della richiesta.request body
HttpRequest
La classe ha una classe interna speciale per questo BodyPublisher
. Sebbene sia tecnicamente un'interfaccia che ha più implementazioni, di cui parleremo di seguito
E inizieremo con il più semplice: l'assenza di un corpo di richiesta. Sì, succede.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
Semplice e bello.
3.2 diString()
La seconda opzione più comune è passare una stringa come corpo della richiesta. Questo è fatto molto semplicemente:
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", "text/plain;charset=UTF-8")
.POST(HttpRequest.BodyPublishers.ofString("Hello"))
.build();
A proposito, puoi impostare la codifica della stringa trasmessa. Può essere molto utile se il server http a cui viene inviata la richiesta non funziona su UTF8.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
.build();
3.3 diFile()
Infine, potresti voler allegare un file alla richiesta POST . Questo è il modo in cui i tuoi avatar vengono solitamente caricati sul server. Per fare ciò, devi chiamare il metodo ofFile()
, dove trasferire Path
il file locale:
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 diByteArray()
Un altro scenario comune consiste nell'inviare un set di byte al server. Ad esempio, hai serializzato un oggetto come un insieme di byte, crittografato qualcosa o vuoi semplicemente inviare un buffer di dati. Ciò richiede un metodo .ofByteArray()
.
Questo metodo accetta un array di byte come parametro. Esempio:
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 diInputStream()
Infine, l'ultimo ma non meno interessante scenario è l'allegato InputStream
a una richiesta POST .
C'è una funzione speciale per questo ofInputStream()
. Ed è molto intelligente. Ti permette di organizzare il trasferimento dei dati da flusso a flusso, allegare un flusso di dati a una richiesta POS che non è ancora aperta.
Devi passare una funzione alla funzione ofInputStream()
, che come risultato restituirà uno stream InputStream
.
Esempio:
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();
Non mi sono preso la briga di recintare il giardino qui, ma penso che tu capisca il principio. Perché l'hanno fatto? Puoi quasi sempre usare il file ofByteArray()
. Ma se vuoi inviare dati in modo asincrono o devi implementare uno scenario particolarmente complesso, puoi utilizzare questo metodo.
GO TO FULL VERSION