4.1 send() metodi, BodyHandlers
Http so'rovini qanday shakllantirish kerakligini o'rganding, endi eng muhim qismga - bu so'rovni yuborishga o'tish mumkin. Eng oddiy holatda buni qilish oson:
HttpRequest request = HttpRequest.newBuilder(new URI("https://javarush.com")).build();
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() );
System.out.println(response.body() );
Bu BodyHandlers nima ekan? Qanday o'ylaysan? So'rovni yubording, demak senga javob - http response kelishi kerak. Va bu javobning response body bo'lishi mumkin: string, fayl, byte massiv, InputStream.
To'g'ri, to'g'ri, hammasi shunday. So'rovni shakllantirganingda bo'lgani kabi, javobda response body turini ko'rsatishing kerak. Ularning soni jami 8 ta:
BodyHandlers.ofByteArrayBodyHandlers.ofStringBodyHandlers.ofFileBodyHandlers.discardingBodyHandlers.replacingBodyHandlers.ofLinesBodyHandlers.fromLineSubscriber
send() metodiga qanday BodyHandlers turini kiritgan bo'lsang, shunday natija turini qaytaradi. Misol:
// response body inobatga olinmagan
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body matn
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body fayl
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
Agar javob sifatida fayl yuborilsa, BodyHandlers.ofFile() metodiga HttpClient obyekti tomonidan saqlanadigan mahalliy fayl nomini kiritish kerak.
4.2 followRedirects() metodi
Shuningdek, so'rov yuborishda HttpClient’ga server javobida 301 yoki 302 (vaqtincha yoki doimiy yo'naltirish) kodini yuborganda nima qilishini ko'rsatishingiz mumkin. Server 302 kodini yuborganini tasavvur qiling va siz: bu vaziyatni kuzatishingiz, javobdan yangi URL olishingiz va yangilangan manzilga so'rov yuborishingiz kerak.
Aslida, bunday ishlar bilan shug'ullanish juda qo'rqinchli, ayniqsa, bu holat tez-tez uchrayotgan va barcha http-klientlarda avtomatlashtirilgan. Shuningdek, bu HttpClient’da so'rov yuborishda qaysi yo'naltirish rejimini tanlaganingizni ko'rsatishingiz kerak.
HttpResponse
response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS ) .build() .send(request, BodyHandlers.ofString());
Yo'naltirish uchun jami 3 ta variant mavjud:
- ALWAYS – har doim;
- NEVER – hech qachon;
- NORMAL – har doim, faqat HTTPS -> HTTP dan tashqari.
Ko'rib turganingizdek, bu erda variantlar kam, lekin har doim sozlash imkoniyatiga ega bo'lganingiz ma'qul.
4.3 proxy() metodi
Yana ba'zi foydali, ammo kamdan-kam qo'llaniladigan opsiyalar mavjud. Ular sizga kerak bo'lmaydi, lekin kerak bo'lganda :)
Birinchi – bu proxy. Odatda hayotda ular bilan tez-tez duch kelmaysiz, lekin ko'plab yirik korporatsiyalar o'z ichida internet-trafik xavfsizligi bo'yicha murakkab tizimga ega, bu esa turli proxy sozlamalarini anglatadi.
Va albatta, sizning dasturingiz, qachonlardir bunday korporatsiyada ishlaydigan paytda proxy ishlatish kerak bo'ladi. Shuning uchun bu opsiyaning mavjudligi yaxshi.
Proxy’ni sozlash juda oson – misol:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Bu yerda default proxy tanlangan, lekin siz o’zingizga mosini sozlashni xohlashingiz mumkin:
HttpResponse
response = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("proxy.microsoft.com", 80)
)) .build() .send(request, BodyHandlers.ofString());
Proxy bilan qanday ishlashni biz ko'rib chiqmaymiz, chunki bu kurs doirasiga kirmaydi.
4.4 authenticator()
Va yana bir muhim narsa. HTTP-protokoli autentifikatsiyani qo'llab-quvvatlaydi. Bevosita protokol darajasida.
Bugungi kunda bu usuldan deyarli foydalanilmaydi, lekin 20 yil avval keng tarqalgan edi. Bunday Http-so'rov quyidagicha ko'rinardi:
http://username@example.com/
Yoki hatto shunday:
http://username:password@example.com/
Bu elektron pochta emas. Bu aynan havola. Ha, sizga shunday tuyuldi. Login va hatto parolni http-so'rovda ko'rsatish mumkin edi. Hozir ham mumkin. Shuning uchun men yozaman, hozir bunday odatda hech kim qilmaydi. Ammo bunday imkoniyat mavjud.
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"password".toCharArray());
}
};
HttpResponse<String> response = HttpClient.newBuilder()
.authenticator(auth).build()
.send(request, BodyHandlers.ofString());
Bu qiziq! Nega “password" o'rniga "password".toCharArray() yozilganligini bilasizmi?
Chunki PasswordAuthentication konstruktorining ikkinchi parametri – String emas, balki CharArray.
Nega ikkinchi parametr String emas, CharArray?
Chunki barcha parollar xavfsizlik maqsadida to'liq qator ko'rinishida hatto o'z dasturida ham saqlash taqiqlanadi. Ya'ni, sizning dasturingiz o'z xotirasida parolni qator ko'rinishida saqlamasligi kerak. Kimdir memory-damp qilsa, undan parolni chiqarib bo'lmaydigan qilish uchun...
Lekin bir vaqtning o'zida parolni butun dunyo bo'ylab himoyalanmagan HTTP-protokol orqali yuborish mumkin :) :) :)
Nima ham derdik. Dunyo mukammal emas.
Bu mavzu bilan batafsil tanishishingiz mumkin bo'lgan havolalar:
GO TO FULL VERSION