CodeGym /Java Course /Module 3 /Een aanvraag doen met HttpClient

Een aanvraag doen met HttpClient

Module 3
Niveau 10 , Les 3
Beschikbaar

4.1 De send() methode, BodyHandlers

U bent klaar met het leren hoe u een http-verzoek maakt , dus u kunt verder gaan met het belangrijkste: dit verzoek verzenden. In het eenvoudigste geval is dit gemakkelijk te doen:


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() ); 

En wat zijn BodyHandlersdit? Wat denk je? U heeft een verzoek verzonden, wat betekent dat u een antwoord zou moeten ontvangen - http response. En dit antwoord kan hebben response body: een string, een bestand, een array van bytes, een InputStream.

Ja, ja, dat klopt. response bodyNet als bij het vormen van een verzoek, moet u het type antwoord specificeren . Er kunnen in totaal 8 stuks zijn:

  • BodyHandlers.ofByteArray
  • BodyHandlers.ofString
  • BodyHandlers.ofFile
  • BodyHandlers.discarding
  • BodyHandlers.replacing
  • BodyHandlers.ofLines
  • BodyHandlers.fromLineSubscriber

Afhankelijk van welk type BodyHandlersu aan de methode hebt doorgegeven send(), zal het zo'n resultaattype retourneren. Voorbeeld:

// 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());

Als een bestand als antwoord naar u moet worden verzonden, BodyHandlers.ofFile()moet u de naam van het lokale bestand doorgeven aan de methode, waar het wordt opgeslagen door het HttpClient-object.

4.2 followRedirects() methode

301Ook kunt u bij het verzenden van een verzoek specificeren wat HttpClient moet doen als de server een of 302(tijdelijke of permanente omleiding) als reactie verzendt. Stel je voor dat de server een code heeft verzonden 302en je moet: deze situatie volgen, een nieuwe URL uit het antwoord halen en het verzoek naar het nieuwe adres sturen.

Ik zou dit niet graag doen, vooral gezien het feit dat deze situatie veel voorkomt en al lang is geautomatiseerd in alle http-clients. Ook in deze HttpClient hoeft u alleen maar aan te geven welke omleidingsmodus u kiest bij het verzenden van het verzoek.

HttpResponse response = HttpClient.newBuilder()
  .followRedirects( HttpClient.Redirect.ALWAYS )
  .build()
  .send(request, BodyHandlers.ofString());

Er zijn slechts 3 opties voor een omleiding:

  • ALTIJD - altijd;
  • NOOIT - nooit;
  • NORMAAL - altijd, behalve HTTPS -> HTTP.

Zoals je kunt zien, zijn er hier niet veel opties, maar het is altijd beter om de mogelijkheid te hebben om aan te passen dan om het niet te hebben.

4.4 De proxy()-methode

Er zijn nog een paar handige, maar niet vaak gebruikte opties. Je hebt ze pas echt nodig als je ze nodig hebt :)

De eerste is proxy. In het gewone leven kom je ze niet vaak tegen, maar veel grote bedrijven hebben een complex beveiligingssysteem voor internetverkeer in zich, en dus verschillende proxy-instellingen.

Welnu, uw software, die ergens in de ingewanden van zo'n bedrijf zal werken, zal op een dag het feit tegenkomen dat het een proxy moet gebruiken. Daarom is het goed dat zo'n optie er ook is.

Het instellen van een proxy is heel eenvoudig - een voorbeeld:

HttpResponse<String> response = HttpClient.newBuilder()
  .proxy( ProxySelector.getDefault())
  .build()
  .send(request, BodyHandlers.ofString());

De standaardproxy is hier gekozen, maar misschien wilt u uw eigen proxy instellen:

HttpResponse response = HttpClient.newBuilder()
  .proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
  .build()
  .send(request, BodyHandlers.ofString());

Hoe we precies met een proxy moeten werken, zullen we niet bespreken, aangezien dit niet in de reikwijdte van deze cursus is opgenomen.

4.5 authenticator()

En nog een belangrijk punt. Het HTTP-protocol ondersteunt authenticatie. Precies op protocolniveau.

Nu wordt deze aanpak bijna niet gebruikt, maar ongeveer 20 jaar geleden was het gebruikelijk. Het HTTP-verzoek zag er als volgt uit:

http://username@example.com/

Of zelfs zo:

http://username:password@example.com/

Dit is geen post. Dit is precies de koppeling. En ja, dat dacht je niet. De login en zelfs het wachtwoord kunnen direct in het http-verzoek worden opgegeven. Ja, zelfs nu kan dat. Daarom schrijf ik dat niemand dit nu normaal doet. Maar er is zo'n mogelijkheid.

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());

Dit is interessant! Weet je waarom in plaats van “password"in de code die er staat "password".toCharArray()?

Omdat de tweede parameter van de constructor PasswordAuthentication niet String, maar CharArray.

En waarom is de tweede parameter dat Stringniet CharArray?

Want om veiligheidsredenen mogen niet alle wachtwoorden als hele string worden opgeslagen, ook niet in je eigen applicatie . Dat wil zeggen dat uw toepassing in het geheugen het wachtwoord niet als een tekenreeks mag opslaan. Zodat als iemand een vochtig geheugen had gemaakt, het wachtwoord er niet uit kon worden gehaald ...

Maar tegelijkertijd kan het wachtwoord via een onveilig HTTP-protocol over de halve wereld worden verzonden :) :) :)

Goed. De wereld is niet perfect.

Via onderstaande links kunt u meer lezen over dit onderwerp:

HTTP-authenticatie

HTTP-authenticatie begrijpen

Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION