Première introduction au protocole HTTP en écrivant le serveur Web Java le plus simple

Je pense qu'il ne serait pas exagéré de dire que la connaissance et la compréhension de l'essence du protocole HTTP sont nécessaires pour quiconque a décidé de s'engager sérieusement dans l'un des domaines du développement Web moderne. Mon expérience personnelle suggère que la compréhension ne vient pas immédiatement. J'ai honte de dire qu'il y avait des moments où les mots GET et POST étaient pour moi des sorts magiques, et je ne soupçonnais même pas l'existence de PUT, PATCH et DELETE.

Il y a quelques mois, en plus du développement lui-même, j'ai également commencé à enseigner, et la question s'est posée de savoir comment il est plus facile et plus clair de parler aux futurs développeurs Java de l'essence du protocole HTTP. Après plusieurs jours d'agitation et une série de tentatives infructueuses pour faire une présentation, l'idée est venue, pourquoi ne pas écrire un simple serveur HTTP en Java, car il n'explique pas l'essence du protocole aussi bien que sa mise en œuvre la plus simple mais la plus fonctionnelle.

Il s'est avéré que ce n'est pas du tout difficile. Voici le code qui sera suffisant pour une interaction correcte avec n'importe quel navigateur! Tout ce dont nous avons besoin est un ServerSocket et des E / S standard.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) { //   Socket socket = serverSocket.accept(); System.out.println("Client connected!"); //      //    try (BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter output = new PrintWriter(socket.getOutputStream())) { //     while (!input.ready()) ; //         System.out.println(); while (input.ready()) { System.out.println(input.readLine()); } //   output.println("HTTP/1.1 200 OK"); output.println("Content-Type: text/html; charset=utf-8"); output.println(); output.println("<p> !</p>"); output.flush(); //     try-with-resources , //         System.out.println("Client disconnected!"); } } } catch (IOException ex) { ex.printStackTrace(); } } } 

Essayez d'exécuter ce code. Il convient de noter que le port pour lequel ServerSocket est créé doit être libre. Si le port spécifié est occupé, vous devez le libérer ou utiliser un autre port libre.

Après avoir exécuté ce code, accédez à la fenêtre du navigateur et tapez dans la barre d'adresse http://localhost:8080/ . Si tout s'est bien passé, alors dans la fenêtre du navigateur, nous verrons le texte "Bonjour à tous", et dans le texte du journal du serveur similaire à celui ci-dessous:

 Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected! 

Chaque fois que nous entrons quelque chose dans la barre d'adresse du navigateur et appuyons sur Entrée, rien d'autre ne se produit que l'envoi de texte commençant par le mot GET et se terminant par un saut de ligne. Après le mot GET, un espace suit le chemin d'accès au document demandé sur le serveur. Essayez d'entrer http://localhost:8080/something dans le navigateur et voyez comment le texte de la demande dans le journal change.

Dans les lignes de requête, à partir de la seconde se trouvent les soi-disant en-têtes au moyen desquels des informations sur les paramètres client sont transmises au serveur. Chaque ligne d'en-tête a le format [ ] : []; []; ... [] [ ] : []; []; ... [] [ ] : []; []; ... [] .

Une fois que le texte de la demande a été entièrement lu par le serveur, nous lui envoyons la réponse la plus simple, dont la structure est assez simple et similaire à la structure de la demande. La première ligne contient la version du protocole HTTP et le code 200 OK , qui indiquera au navigateur que la demande a été traitée avec succès (tout le monde connaît mieux le code 404, n'est-ce pas;)). Ceci est suivi d'un seul en - tête Content-Type dans lequel les informations sur le format du document transmis (text / html) et son encodage (charset = utf-8) sont transmises. Après l'en-tête se trouve un saut de ligne (une exigence obligatoire du protocole HTTP) et le texte réel qui sera affiché dans le navigateur.

C’est tout! Bien sûr, c'est loin d'être tout ce que vous devez savoir sur le protocole HTTP et les principes de développement de serveurs Web, mais je ne voudrais pas compliquer cet exemple, car sa tâche principale est de démontrer la communication la plus simple via le protocole HTTP. Dans un de mes prochains articles, je vais essayer de développer le sujet de l'étude du protocole HTTP à travers sa mise en œuvre.

UPD Un exemple beaucoup plus avancé d'un tel serveur peut être trouvé dans Comment fonctionne Tomcat: Un guide pour développer votre propre conteneur de servlet Java par Paul Deck, Budi Kurniawan , Chapitre 1 - Serveur Web simple .

UPD1. Webinaire basé sur cet article www.youtube.com/watch?v=RBUFdFKg_rI

Source: https://habr.com/ru/post/fr441150/


All Articles