3.1 Издатели на тела
Надявам се, че не сте забравor, че освен GET заявките , има и PUT и POST заявки , когато също трябва да добавите към заявката request body
, тоест тялото на заявката.
HttpRequest
Класът има специален вътрешен клас за това BodyPublisher
. Въпреки че технически това е интерфейс, който има множество реализации, които ще обсъдим по-долу
И ще започнем с най-простото - липсата на тяло на заявката. Да, случва се.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
Просто и красиво.
3.2 ofString()
Втората най-често срещана опция е да се предаде няHowъв низ като тяло на заявката. Това се прави много просто:
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", "text/plain;charset=UTF-8")
.POST(HttpRequest.BodyPublishers.ofString("Hello"))
.build();
Между другото, можете да зададете codeирането на предавания низ. Може да бъде много полезно, ако http сървърът, към който е изпратена заявката, не работи на UTF8.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
.build();
3.3 ofFile()
И накрая, може да искате да прикачите файл към POST заявката . Това е начинът, по който вашите аватари обикновено се качват на сървъра. За да направите това, трябва да извикате метода ofFile()
, където да прехвърлите Path
локалния файл:
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()
Друг обичаен сценарий е да изпратите набор от byteове към сървъра. Например, вие сте сериализирали няHowъв обект като набор от byteове, шифровали сте нещо or просто искате да изпратите няHowъв буфер за данни. Това изисква метод .ofByteArray()
.
Този метод приема масив от byteове като параметър. Пример:
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()
И накрая, последният, но не на последно място интересен сценарий е прикачването InputStream
към POST заявка .
Има специална функция за това ofInputStream()
. И тя е много умна. Тя ви позволява да организирате прехвърлянето на данни от поток към поток, да прикачите поток от данни към POS заявка , която дори още не е отворена.
Трябва да предадете функция на функцията ofInputStream()
, която ще върне поток като резултат InputStream
.
Пример:
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();
Не си направих труда да оградя градината тук, но мисля, че разбирате принципа. Защо го направиха? Почти винаги можете да използвате ofByteArray()
. Но ако искате да изпращате данни асинхронно or трябва да приложите няHowъв особено сложен сценарий, тогава можете да използвате този метод.
GO TO FULL VERSION