4.1 Send()-metoden, BodyHandlers
Du er færdig med at lære at danne en http-anmodning , så du kan gå videre til det vigtigste - at sende denne anmodning. I det enkleste tilfælde er dette nemt at gø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 hvad er BodyHandlers
disse? Hvad synes du? Du har sendt en anmodning, hvilket betyder, at du skal modtage et svar - http response
. Og dette svar kan have response body
: en streng, en fil, et array af bytes, en InputStream.
Ja, ja, det er rigtigt. Ligesom når du laver en anmodning, skal du angive typen response body
af svaret. Der kan være 8 stk i alt:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Afhængigt af hvilken type BodyHandlers
du har videregivet til metoden send()
, vil den returnere en sådan 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 dig som svar, BodyHandlers.ofFile()
skal du videregive navnet på den lokale fil til metoden, hvor den gemmes af HttpClient-objektet.
4.2 followRedirects() metode
301
Når du sender en anmodning, kan du også angive, hvad HttpClient skal gøre, hvis serveren sender eller 302
(midlertidig eller permanent omdirigering) som svar . Forestil dig, at serveren har sendt en kode 302
, og du skal: spore denne situation, få en ny URL fra svaret og sende anmodningen til den nye adresse.
Jeg ville ikke meget gerne gøre dette, især i betragtning af at denne situation er almindelig og længe har været automatiseret i alle http-klienter. Også i denne HttpClient skal du blot angive, hvilken omdirigeringstilstand du vælger, når du sender anmodningen.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Der er kun 3 muligheder for en omdirigering:
- ALTID - altid;
- ALDRIG - aldrig;
- NORMAL - altid, undtagen HTTPS -> HTTP.
Som du kan se, er der ikke mange muligheder her, men det er altid bedre at have muligheden for at tilpasse end ikke at have det.
4.4 Proxy()-metoden
Der er et par mere nyttige, men ikke ofte brugte muligheder. Du behøver dem ikke lige før du har brug for dem :)
Den første er proxy. I det almindelige liv støder du ikke ofte på dem, men mange store virksomheder har et komplekst internettrafiksikkerhedssystem inde i sig og derfor forskellige proxyindstillinger.
Nå, selvfølgelig, din software, som vil fungere et sted i indvoldene af sådan en virksomhed, vil en dag støde på det faktum, at den bliver nødt til at bruge en proxy. Derfor er det godt, at sådan en mulighed også er her.
Opsætning af en proxy er meget enkel - et eksempel:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Standardproxyen er valgt her, men du vil måske indstille din egen:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Hvordan man præcist arbejder med en proxy, vil vi ikke overveje, da dette ikke er inkluderet i dette kursus.
4.5 authenticator()
Og endnu en vigtig pointe. HTTP-protokollen understøtter godkendelse. Lige på protokolniveau.
Nu bruges denne tilgang næsten ikke, men for omkring 20 år siden var den almindelig. Http-anmodningen så således ud:
http://username@example.com/
Eller endda sådan her:
http://username:password@example.com/
Dette er ikke mail. Dette er præcis linket. Og ja, det troede du ikke. Login og endda adgangskoden kunne angives direkte i http-anmodningen. Ja, selv nu kan du. Derfor skriver jeg, at ingen plejer at gøre det her nu. Men der er sådan en mulighed.
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());
Det her er interessant! Ved du hvorfor i stedet for “password"
i koden står der "password".toCharArray()
?
Fordi den anden parameter i konstruktøren PasswordAuthentication
ikke er String
, men CharArray
.
Og hvorfor er den anden parameter ikke String
, hva' CharArray
?
Fordi alle adgangskoder ikke må gemmes som en hel streng af sikkerhedsmæssige årsager, heller ikke i din egen applikation . Det vil sige, at din applikation i sin hukommelse ikke skal gemme adgangskoden som en streng. Så hvis nogen lavede fugt-hukommelse, kunne kodeordet ikke trækkes ud af det ...
Men samtidig kan adgangskoden overføres over en usikker HTTP-protokol over halvdelen af verden :) :) :)
Godt. Verden er ikke perfekt.
Du kan læse mere om dette emne på nedenstående links:
GO TO FULL VERSION