4.1 Send()-metoden, BodyHandlers
Du er ferdig med å lære hvordan du oppretter en http-forespørsel , så du kan gå videre til det viktigste - å sende denne forespørselen. I det enkleste tilfellet er dette enkelt å gjøre:
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() );
Og hva er BodyHandlers
disse? Hva tror du? Du sendte en forespørsel, som betyr at du skal få svar - http response
. Og dette svaret kan ha response body
: en streng, en fil, en rekke byte, en InputStream.
Ja, ja, det stemmer. Akkurat som når du oppretter en forespørsel, må du spesifisere typen response body
svar. Det kan være 8 stykker totalt:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Avhengig av hvilken type BodyHandlers
du sendte til metoden send()
, vil den returnere en slik resultattype. Eksempel:
// 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());
Hvis en fil skal sendes til deg som et svar, BodyHandlers.ofFile()
må du sende navnet på den lokale filen til metoden, der den lagres av HttpClient-objektet.
4.2 followRedirects()-metoden
301
Når du sender en forespørsel, kan du også spesifisere hva HttpClient skal gjøre hvis serveren sender eller 302
(midlertidig eller permanent omdirigering) som svar . Tenk deg at serveren har sendt en kode 302
, og du må: spore denne situasjonen, få en ny URL fra svaret og sende forespørselen til den nye adressen.
Jeg har ikke så lyst til å gjøre dette, spesielt med tanke på at denne situasjonen er vanlig og lenge har vært automatisert i alle http-klienter. Også i denne HttpClienten trenger du bare å spesifisere hvilken omdirigeringsmodus du velger når du sender forespørselen.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Det er bare 3 alternativer for en omdirigering:
- ALLTID - alltid;
- ALDRI - aldri;
- NORMAL - alltid, bortsett fra HTTPS -> HTTP.
Som du kan se er det ikke mange alternativer her, men det er alltid bedre å ha muligheten til å tilpasse enn å ikke ha det.
4.4 Proxy()-metoden
Det er et par flere nyttige, men ikke ofte brukte alternativer. Du trenger dem ikke akkurat før du trenger dem :)
Den første er proxy. I det vanlige livet møter du dem ikke ofte, men mange store selskaper har et komplekst Internett-trafikksikkerhetssystem inne i seg, og derav ulike proxy-innstillinger.
Vel, selvfølgelig, programvaren din, som vil fungere et sted i innvollene til et slikt selskap, vil en dag møte det faktum at den må bruke en proxy. Derfor er det bra at et slikt alternativ også er her.
Det er veldig enkelt å sette opp en proxy - et eksempel:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Standard proxy er valgt her, men det kan være lurt å angi din egen:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Hvordan man nøyaktig skal jobbe med en proxy, vil vi ikke vurdere, siden dette ikke er inkludert i omfanget av dette kurset.
4.5 autentisering()
Og enda et viktig poeng. HTTP-protokollen støtter autentisering. Rett på protokollnivå.
Nå brukes nesten ikke denne tilnærmingen, men for rundt 20 år siden var den vanlig. Http-forespørselen så slik ut:
http://username@example.com/
Eller til og med slik:
http://username:password@example.com/
Dette er ikke post. Dette er akkurat lenken. Og ja, du trodde ikke det. Påloggingen og til og med passordet kan spesifiseres direkte i http-forespørselen. Ja, selv nå kan du. Derfor skriver jeg at ingen pleier å gjøre dette nå. Men det er en slik mulighet.
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());
Dette er interessant! Vet du hvorfor i stedet for “password"
i koden står det "password".toCharArray()
?
Fordi den andre parameteren til konstruktøren PasswordAuthentication
ikke er String
, men CharArray
.
Og hvorfor er ikke den andre parameteren String
det CharArray
?
Fordi alle passord ikke er tillatt å lagre som en hel streng av sikkerhetshensyn, selv i din egen applikasjon . Det vil si at applikasjonen din i minnet ikke skal lagre passordet som en streng. Slik at hvis noen laget fuktig minne, kunne ikke passordet trekkes ut av det ...
Men samtidig kan passordet overføres over en usikker HTTP-protokoll over halve verden :) :) :)
Vi vil. Verden er ikke perfekt.
Du kan lese mer om dette emnet på lenkene nedenfor: