4.1 La méthode send(), BodyHandlers
Vous avez fini d'apprendre à former une requête http , vous pouvez donc passer à la chose la plus importante - l'envoi de cette requête. Dans le cas le plus simple, c'est facile à faire :
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() );
Et quels sont BodyHandlers
-ils? Qu'en penses-tu? Vous avez envoyé une demande, ce qui signifie que vous devriez recevoir une réponse - http response
. Et cette réponse peut avoir response body
: une chaîne, un fichier, un tableau d'octets, un InputStream.
Oui, oui, c'est vrai. Tout comme lors de la formulation d'une requête, vous devez spécifier le type response body
de réponse. Il peut y avoir 8 pièces au total :
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Selon le type BodyHandlers
que vous avez passé à la method send()
, elle renverra un tel type de résultat. Exemple:
// 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());
Si un fichier doit vous être envoyé en réponse, BodyHandlers.ofFile()
vous devez transmettre le nom du fichier local à la méthode, où il sera enregistré par l'objet HttpClient.
4.2 méthode followRedirects()
301
De plus, lors de l'envoi d'une requête, vous pouvez spécifier ce que HttpClient doit faire si le serveur envoie ou 302
(redirection temporaire ou permanente) en réponse . Imaginez que le serveur a envoyé un code 302
et que vous devez : suivre cette situation, obtenir une nouvelle URL à partir de la réponse et envoyer la requête à la nouvelle adresse.
Je n'aimerais pas beaucoup faire cela, d'autant plus que cette situation est courante et a longtemps été automatisée dans tous les clients http. Également dans ce HttpClient, il vous suffit de spécifier le mode de redirection que vous choisissez lors de l'envoi de la demande.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Il n'y a que 3 options pour une redirection :
- TOUJOURS - toujours ;
- JAMAIS - jamais ;
- NORMAL - toujours, sauf HTTPS -> HTTP.
Comme vous pouvez le voir, il n'y a pas beaucoup d'options ici, mais il est toujours préférable d'avoir la possibilité de personnaliser que de ne pas l'avoir.
4.4 La méthode proxy()
Il existe quelques options plus utiles, mais pas souvent utilisées. Vous n'en avez pas besoin exactement jusqu'à ce que vous en ayez besoin :)
Le premier est proxy. Dans la vie ordinaire, vous ne les rencontrez pas souvent, mais de nombreuses grandes entreprises disposent d'un système complexe de sécurité du trafic Internet, et donc de divers paramètres de proxy.
Eh bien, bien sûr, votre logiciel, qui fonctionnera quelque part dans les entrailles d'une telle société, rencontrera un jour le fait qu'il devra utiliser un proxy. Par conséquent, il est bon qu'une telle option soit également ici.
La configuration d'un proxy est très simple - un exemple :
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Le proxy par défaut a été choisi ici, mais vous pouvez définir le vôtre :
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Comment exactement travailler avec un proxy, nous ne le considérerons pas, car cela n'est pas inclus dans le cadre de ce cours.
4.5 authentificateur()
Et encore un point important. Le protocole HTTP prend en charge l'authentification. Juste au niveau du protocole.
Aujourd'hui, cette approche n'est presque plus utilisée, mais il y a environ 20 ans, elle était courante. La requête HTTP ressemblait à ceci :
http://username@example.com/
Ou même comme ça :
http://username:password@example.com/
Ce n'est pas du courrier. C'est exactement le lien. Et oui, vous ne le pensiez pas. Le login et même le mot de passe peuvent être spécifiés directement dans la requête http. Oui, même maintenant vous le pouvez. C'est pourquoi j'écris que personne ne le fait habituellement maintenant. Mais il y a une telle possibilité.
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());
C'est intéressant! Savez-vous pourquoi au lieu de “password"
dans le code, il dit "password".toCharArray()
?
Parce que le deuxième paramètre du constructeur PasswordAuthentication
n'est pas String
, mais CharArray
.
Et pourquoi le second paramètre ne l'est-il pas String
, hein CharArray
?
Parce que tous les mots de passe ne sont pas autorisés à être stockés sous forme de chaîne entière pour des raisons de sécurité, même dans votre propre application . Autrement dit, votre application dans sa mémoire ne doit pas stocker le mot de passe sous forme de chaîne. Ainsi, si quelqu'un faisait de la mémoire humide, le mot de passe ne pourrait pas en être extrait ...
Mais en même temps, le mot de passe peut être transmis via un protocole HTTP non sécurisé dans la moitié du monde :) :) :)
Bien. Le monde n'est pas parfait.
Vous pouvez en savoir plus sur ce sujet sur les liens ci-dessous :