3.1 BodyPublishers
Umid qilamanki, siz unutmagansiz, GET so'rovlaridan tashqari, yana PUT va POST so'rovlari ham bor, unda so'rovga qo'shimcha qilib request body, ya'ni so'rovning tanasini qo'shish kerak.
Buning uchun HttpRequest classida maxsus ichki class BodyPublisher mavjud. Texnik jihatdan bu interfeys bo'lib, uning bir nechta amalga oshirishlari mavjud, ular haqida keyinroq gaplashamiz.
Biz eng oddiyidan boshlaymiz – so'rov tanasi yo'q. Ha, shunday ham bo'ladi.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
Oddiy va chiroyli.
3.2 ofString()
Ikkinchi eng keng tarqalgan variant – bu request body sifatida biror string berish. Bu juda oddiy amalga oshiriladi:
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.headers("Content-Type", "text/plain;charset=UTF-8")
.POST(HttpRequest.BodyPublishers.ofString("Salom"))
.build();
Aytgancha, uzatiladigan string uchun kodlovni ham belgilashingiz mumkin. Bu juda foydali bo'lishi mumkin, agar http-server, qaysi so'rov yuborilayotgan bo'lsa, UTF8da ishlamasa.
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.POST(HttpRequest.BodyPublishers.ofString("Salom", Charset. US-ASCII)))
.build();
3.3 ofFile()
Va nihoyat, POST-so'rovga faylni qo'shishni xohlashingiz mumkin. Odatda sizning avatarlaringizni serverga zaryad qilish shunday amalga oshiriladi. Buning uchun ofFile() metodini chaqirish kerak, bu joyga mahalliy faylning Path ni uzatish kerak:
Path avatar = Path.of("c://avatar.jpeg");
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.headers("Content-Type", "image/jpeg")
.POST(HttpRequest.BodyPublishers.ofFile(avatar))
.build();
3.4 ofByteArray()
Yana bir keng tarqalgan stsenariy – serverga baytlar to'plamini yuborish. Masalan, siz biror obyektni baytlar to'plami shaklida serializatsiya qildingiz, nimanidir shifrladingiz yoki shunchaki biror ma'lumotlar buferini yubormoqchisiz. Buning uchun .ofByteArray() metodi kerak bo'ladi.
Bu metod parametr sifatida baytlar massivini qabul qiladi. Misol:
byte[] data = "Mening maxfiy xabarim".getBytes();
byte[] dataEncripted = SuperEncriptor.encript(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.headers("Content-Type", "application/octet-stream")
.POST(HttpRequest.BodyPublishers.ofByteArray(dataEncripted))
.build();
3.5 ofInputStream()
Nihoyat, so'nggi, lekin qiziqarli scenariy – InputStream ni POST-so'rovga biriktirish.
Buning uchun maxsus funksiya mavjud – ofInputStream(). Va bu juda aqlli. Bu funksiyani oqimdan oqimga ma'lumot uzatish imkonini beradi, POST-so'rovga ma'lumotlar oqimini biriktirish, hali ochilmagan ma'lumot oqimi.
ofInputStream() funksiyasiga natija sifatida InputStream oqimini qaytaradigan funksiyani uzatish kerak.
Misol:
byte[] data = "Mening maxfiy xabarim".getBytes();
//baytlar massivini oqimga o‘rash.
InputStream is = new ByteArrayInputStream(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.headers("Content-Type", "application/octet-stream")
.POST(HttpRequest.BodyPublishers.ofInputStream (() -> is;))
.build();
Men bu yerda katta masala qilganim yo'q, lekin o'ylaymanki, siz masalaning mohiyatini tushundingiz. Nega bunday qilingan? Deyarli har doim siz ofByteArray() metodidan foydalanishingiz mumkin. Lekin agar siz asinxron ma'lumotlarni yuborishni xohlasangiz yoki qandaydir ayniqsa murakkab scenariyni amalga oshirish lozim bo'lsa, bu metoddan foydalanishingiz mumkin.
GO TO FULL VERSION