4.1 Ang paraan ng send(), BodyHandlers
Natapos mo na ang pag-aaral kung paano bumuo ng isang kahilingan sa http , upang maaari kang magpatuloy sa pinakamahalagang bagay - ang pagpapadala ng kahilingang ito. Sa pinakasimpleng kaso, ito ay madaling gawin:
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).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() );
At ano ang BodyHandlers
mga ito? Ano sa tingin mo? Nagpadala ka ng kahilingan, na nangangahulugang dapat kang makatanggap ng sagot - http response
. At ang tugon na ito ay maaaring magkaroon ng response body
: isang string, isang file, isang hanay ng mga byte, isang InputStream.
Oo, oo, tama iyan. Tulad ng kapag bumubuo ng isang kahilingan, kailangan mong tukuyin ang uri response body
ng tugon. Maaaring mayroong 8 piraso sa kabuuan:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Depende sa kung anong uri BodyHandlers
ang ipinasa mo sa pamamaraan send()
, ibabalik nito ang ganoong uri ng resulta. Halimbawa:
// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
Kung ang isang file ay dapat ipadala sa iyo bilang tugon, pagkatapos ay BodyHandlers.ofFile()
kailangan mong ipasa ang pangalan ng lokal na file sa pamamaraan, kung saan ito ay ise-save ng HttpClient object.
4.2 followRedirects() na pamamaraan
301
Gayundin, kapag nagpapadala ng kahilingan, maaari mong tukuyin kung ano ang dapat gawin ng HttpClient kung magpapadala ang server o 302
(pansamantala o permanenteng pag-redirect) bilang tugon . Isipin na nagpadala ang server ng code 302
, at kailangan mong: subaybayan ang sitwasyong ito, kumuha ng bagong URL mula sa tugon, at ipadala ang kahilingan sa bagong address.
Hindi ko gustong gawin ito, lalo na kung isasaalang-alang na ang sitwasyong ito ay karaniwan at matagal nang awtomatiko sa lahat ng mga kliyente ng http. Gayundin sa HttpClient na ito kailangan mo lang tukuyin kung aling redirect mode ang pipiliin mo kapag ipinapadala ang kahilingan.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Mayroon lamang 3 mga pagpipilian para sa isang pag-redirect:
- LAGING - palagi;
- HINDI - kailanman;
- NORMAL - palagi, maliban sa HTTPS -> HTTP.
Tulad ng nakikita mo, walang maraming mga pagpipilian dito, ngunit palaging mas mahusay na magkaroon ng kakayahang mag-customize kaysa sa hindi magkaroon nito.
4.4 Ang proxy() na paraan
Mayroong ilang mas kapaki-pakinabang, ngunit hindi madalas na ginagamit na mga pagpipilian. Hindi mo eksaktong kailangan ang mga ito hangga't hindi mo sila kailangan :)
Ang una ay proxy. Sa ordinaryong buhay, hindi mo sila madalas makatagpo, ngunit maraming malalaking korporasyon ang may isang kumplikadong sistema ng seguridad ng trapiko sa Internet sa loob ng mga ito, at samakatuwid ay iba't ibang mga setting ng proxy.
Well, siyempre, ang iyong software, na gagana sa isang lugar sa bituka ng naturang korporasyon, balang araw ay makakatagpo ng katotohanan na kakailanganin nitong gumamit ng proxy. Samakatuwid, mabuti na ang ganitong pagpipilian ay narito rin.
Ang pag-set up ng proxy ay napakasimple - isang halimbawa:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Ang default na proxy ay pinili dito, ngunit maaaring gusto mong itakda ang iyong sarili:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Paano eksaktong magtrabaho sa isang proxy, hindi namin isasaalang-alang, dahil hindi ito kasama sa saklaw ng kursong ito.
4.5 authenticator()
At isa pang mahalagang punto. Sinusuportahan ng HTTP protocol ang pagpapatunay. Sa mismong antas ng protocol.
Ngayon ang pamamaraang ito ay halos hindi ginagamit, ngunit mga 20 taon na ang nakalilipas ito ay karaniwan. Ang kahilingan sa Http ay ganito ang hitsura:
http://username@example.com/
O kahit ganito:
http://username:password@example.com/
Hindi ito mail. Ito mismo ang link. At oo, hindi mo naisip. Ang pag-login at maging ang password ay maaaring direktang tukuyin sa kahilingan sa http. Oo, kahit ngayon kaya mo. Kaya nga sinusulat ko na walang gumagawa nito ngayon. Ngunit may ganoong posibilidad.
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());
Ito ay kawili-wili! Alam mo ba kung bakit sa halip na “password"
sa code na sinasabi nito "password".toCharArray()
?
Dahil ang pangalawang parameter ng constructor PasswordAuthentication
ay hindi String
, ngunit CharArray
.
At bakit ang pangalawang parameter ay hindi String
, huh CharArray
?
Dahil ang lahat ng mga password ay hindi pinapayagan na maimbak bilang isang buong string para sa mga layuning pangseguridad, kahit na sa iyong sariling application . Iyon ay, ang iyong application sa memorya nito ay hindi dapat mag-imbak ng password bilang isang string. Upang kung ang isang tao ay gumawa ng damp-memory, ang password ay hindi ma-pull out dito ...
Ngunit sa parehong oras, ang password ay maaaring maipadala sa isang hindi secure na HTTP protocol sa kalahati ng mundo :) :) :)
Well. Hindi perpekto ang mundo.
Maaari mong basahin ang higit pa tungkol sa paksang ito sa mga link sa ibaba: