4.1 Metoda send(), BodyHandlers
Ați terminat de învățat cum să formați o solicitare http , astfel încât să puteți trece la cel mai important lucru - trimiterea acestei solicitări. În cel mai simplu caz, acest lucru este ușor de făcut:
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() );
Și care sunt BodyHandlers
acestea? Ce crezi? Ați trimis o solicitare, ceea ce înseamnă că ar trebui să primiți un răspuns - http response
. Și acest răspuns poate avea response body
: un șir, un fișier, o matrice de octeți, un InputStream.
Da, da, așa este. La fel ca atunci când formați o cerere, trebuie să specificați tipul response body
răspunsului. Pot fi 8 piese în total:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
În funcție de tipul pe care BodyHandlers
l-ați trecut la metodă send()
, va returna un astfel de tip de rezultat. Exemplu:
// 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());
Dacă un fișier ar trebui să vă fie trimis ca răspuns, atunci BodyHandlers.ofFile()
trebuie să treceți numele fișierului local metodei, unde va fi salvat de obiectul HttpClient.
4.2 metoda followRedirects().
301
De asemenea, atunci când trimiteți o solicitare, puteți specifica ce ar trebui să facă HttpClient dacă serverul trimite sau 302
(redirecționare temporară sau permanentă) ca răspuns . Imaginați-vă că serverul a trimis un cod 302
și trebuie să urmăriți această situație, să obțineți o nouă adresă URL din răspuns și să trimiteți cererea la noua adresă.
Nu mi-ar plăcea prea mult să fac asta, mai ales având în vedere că această situație este obișnuită și a fost de multă vreme automatizată în toți clienții http. De asemenea, în acest HttpClient trebuie doar să specificați ce mod de redirecționare alegeți atunci când trimiteți cererea.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Există doar 3 opțiuni pentru o redirecționare:
- Întotdeauna - întotdeauna;
- NICIODATĂ - niciodată;
- NORMAL - întotdeauna, cu excepția HTTPS -> HTTP.
După cum puteți vedea, nu există multe opțiuni aici, dar este întotdeauna mai bine să aveți capacitatea de a personaliza decât să nu o aveți.
4.4 Metoda proxy().
Există câteva opțiuni mai utile, dar nu folosite des. Nu ai nevoie de ele exact până când nu ai nevoie de ele :)
Primul este proxy. În viața obișnuită, nu le întâlniți des, dar multe corporații mari au în interior un sistem complex de securitate a traficului pe Internet și, prin urmare, diverse setări de proxy.
Ei bine, desigur, software-ul tău, care va funcționa undeva în măruntaiele unei astfel de corporații, va întâlni într-o zi faptul că va trebui să folosească un proxy. Prin urmare, este bine ca o astfel de opțiune să fie și aici.
Configurarea unui proxy este foarte simplă - un exemplu:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Proxy-ul implicit a fost ales aici, dar poate doriți să vă setați propriul:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Cum să lucrați exact cu un proxy, nu vom lua în considerare, deoarece acest lucru nu este inclus în domeniul de aplicare al acestui curs.
4.5 autentificator()
Și încă un punct important. Protocolul HTTP acceptă autentificare. Chiar la nivel de protocol.
Acum această abordare aproape că nu este folosită, dar acum aproximativ 20 de ani era obișnuită. Solicitarea Http arăta astfel:
http://username@example.com/
Sau chiar asa:
http://username:password@example.com/
Aceasta nu este mail. Acesta este exact linkul. Și da, nu credeai. Login-ul și chiar parola ar putea fi specificate direct în cererea http. Da, chiar și acum poți. De aceea scriu că de obicei nimeni nu face asta acum. Dar există o astfel de posibilitate.
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());
Acest lucru este interesant! Știți de ce, în loc să “password"
scrie în cod "password".toCharArray()
?
Deoarece al doilea parametru al constructorului PasswordAuthentication
nu este String
, ci CharArray
.
Și de ce al doilea parametru nu este String
, nu CharArray
?
Deoarece toate parolele nu au voie să fie stocate ca un șir întreg din motive de securitate, chiar și în propria aplicație . Adică, aplicația dvs. în memoria sa nu ar trebui să stocheze parola ca șir. Astfel încât, dacă cineva a făcut memorie umedă, parola nu ar putea fi scoasă din ea...
Dar, în același timp, parola poate fi transmisă printr-un protocol HTTP nesecurizat în jumătate din lume :) :) :)
Bine. Lumea nu este perfectă.
Puteți citi mai multe despre acest subiect la linkurile de mai jos: