3.1 Wydawcy ciał

Mam nadzieję, że nie zapomnieliście, że oprócz żądań GET , są też żądania PUT i POST , przy których trzeba jeszcze dodać do żądania , czyli treść żądania.request body

Klasa ma do tego HttpRequestspecjalną klasę wewnętrzną BodyPublisher. Chociaż technicznie jest to interfejs, który ma wiele implementacji, które omówimy poniżej

Zaczniemy od najprostszego - braku treści żądania. Tak, to się zdarza.


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

Proste i piękne.

3.2 ofString()

Drugą najczęstszą opcją jest przekazanie jakiegoś ciągu znaków jako treści żądania. Odbywa się to bardzo prosto:


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

Nawiasem mówiąc, możesz ustawić kodowanie przesyłanego ciągu znaków. Może to być bardzo przydatne, jeśli serwer http, do którego wysyłane jest żądanie, nie działa na UTF8.


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

3.3 ofFile()

Na koniec możesz dołączyć plik do żądania POST . W ten sposób Twoje awatary są zwykle przesyłane na serwer. Aby to zrobić, musisz wywołać metodę ofFile(), gdzie przenieść Pathplik lokalny:


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

Innym typowym scenariuszem jest wysłanie zestawu bajtów do serwera. Na przykład serializowałeś jakiś obiekt jako zestaw bajtów, coś zaszyfrowałeś lub po prostu chcesz wysłać jakiś bufor danych. To wymaga metody .ofByteArray().

Ta metoda przyjmuje tablicę bajtów jako parametr. Przykład:


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 strumienia wejściowego()

Ostatnim, ale nie najmniej interesującym scenariuszem jest dołączanie InputStreamdo żądania POST .

Jest do tego specjalna funkcja ofInputStream(). I jest bardzo mądra. Pozwala zorganizować transfer danych ze strumienia do strumienia, dołączyć strumień danych do żądania POS , które nie jest jeszcze otwarte.

Musisz przekazać funkcję do funkcji ofInputStream(), która w rezultacie zwróci strumień InputStream.

Przykład:


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

Nie zawracałem sobie głowy ogrodzeniem ogrodu tutaj, ale myślę, że rozumiesz zasadę. Dlaczego to zrobili? Prawie zawsze możesz użyć ofByteArray(). Ale jeśli chcesz wysłać dane asynchronicznie lub musisz zaimplementować jakiś szczególnie złożony scenariusz, możesz użyć tej metody.