4.1 Die send()-Methode, BodyHandlers

Sie haben nun gelernt, wie Sie eine HTTP-Anfrage erstellen , sodass Sie mit dem Wichtigsten fortfahren können – dem Senden dieser Anfrage. Im einfachsten Fall geht das ganz einfach:


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

Und was sind BodyHandlersdas? Was denkst du? Sie haben eine Anfrage gesendet, was bedeutet, dass Sie eine Antwort erhalten sollten - http response. Und diese Antwort kann Folgendes haben response body: eine Zeichenfolge, eine Datei, ein Byte-Array, einen InputStream.

Ja, ja, das stimmt. Genau wie beim Formulieren einer Anfrage müssen Sie die Art response bodyder Antwort angeben. Insgesamt können es 8 Stück sein:

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

Abhängig davon, welchen Typ BodyHandlersSie an die Methode übergeben haben send(), wird ein solcher Ergebnistyp zurückgegeben. Beispiel:

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

Wenn Ihnen als Antwort eine Datei gesendet werden soll, BodyHandlers.ofFile()müssen Sie den Namen der lokalen Datei an die Methode übergeben, wo sie vom HttpClient-Objekt gespeichert wird.

4.2 followRedirects()-Methode

Außerdem können Sie beim Senden einer Anfrage angeben, was HttpClient tun soll, wenn der Server eine Antwort sendet 301( 302temporäre oder permanente Umleitung) . Stellen Sie sich vor, der Server hat einen Code gesendet 302und Sie müssen diese Situation verfolgen, eine neue URL aus der Antwort abrufen und die Anfrage an die neue Adresse senden.

Ich würde das nicht gerne tun, insbesondere wenn man bedenkt, dass diese Situation häufig vorkommt und seit langem in allen http-Clients automatisiert ist. Auch in diesem HttpClient müssen Sie nur angeben, welchen Umleitungsmodus Sie beim Senden der Anfrage wählen.

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

Für eine Weiterleitung gibt es nur 3 Möglichkeiten:

  • IMMER - immer;
  • NIEMALS - niemals;
  • NORMAL – immer, außer HTTPS -> HTTP.

Wie Sie sehen, gibt es hier nicht viele Optionen, aber es ist immer besser, die Möglichkeit zur Anpassung zu haben, als sie nicht zu haben.

4.4 Die Proxy()-Methode

Es gibt noch ein paar weitere nützliche, aber nicht oft genutzte Optionen. Du brauchst sie nicht genau, bis du sie brauchst :)

Der erste ist Proxy. Im normalen Leben begegnet man ihnen nicht oft, aber viele große Unternehmen verfügen über ein komplexes Sicherheitssystem für den Internetverkehr und daher über verschiedene Proxy-Einstellungen.

Nun, natürlich wird Ihre Software, die irgendwo im Inneren eines solchen Unternehmens funktionieren wird, eines Tages mit der Tatsache konfrontiert, dass sie einen Proxy verwenden muss. Daher ist es gut, dass es auch hier eine solche Option gibt.

Das Einrichten eines Proxys ist ganz einfach – ein Beispiel:

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

Hier wurde der Standard-Proxy ausgewählt, aber Sie möchten möglicherweise Ihren eigenen festlegen:

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

Auf die genaue Arbeit mit einem Proxy gehen wir nicht ein, da dies nicht im Umfang dieses Kurses enthalten ist.

4.5 Authenticator()

Und noch ein wichtiger Punkt. Das HTTP-Protokoll unterstützt die Authentifizierung. Direkt auf Protokollebene.

Heutzutage wird dieser Ansatz fast nicht mehr verwendet, aber vor etwa 20 Jahren war er üblich. Die HTTP-Anfrage sah so aus:

http://username@example.com/

Oder sogar so:

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

Das ist keine Post. Das ist genau der Link. Und ja, das hast du nicht gedacht. Der Login und sogar das Passwort könnten direkt in der http-Anfrage angegeben werden. Ja, das können Sie schon jetzt. Deshalb schreibe ich, dass das jetzt normalerweise niemand mehr macht. Aber es gibt eine solche Möglichkeit.

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

Das ist interessant! Wissen Sie, warum “password"das so ist, anstatt im Code zu stehen "password".toCharArray()?

Denn der zweite Parameter des Konstruktors PasswordAuthentication ist nicht String, sondern CharArray.

Und warum ist der zweite Parameter nicht Stringso CharArray?

Denn aus Sicherheitsgründen dürfen nicht alle Passwörter als ganze Zeichenfolge gespeichert werden, auch nicht in der eigenen Anwendung . Das heißt, Ihre Anwendung sollte das Kennwort nicht in ihrem Speicher als Zeichenfolge speichern. Damit, wenn jemand einen feuchten Speicher erstellt, das Passwort nicht daraus gezogen werden kann ...

Aber gleichzeitig kann das Passwort über ein unsicheres HTTP-Protokoll um die halbe Welt übertragen werden :) :) :)

Also. Die Welt ist nicht perfekt.

Weitere Informationen zu diesem Thema finden Sie unter den folgenden Links:

HTTP-Authentifizierung

Grundlegendes zur HTTP-Authentifizierung