Notes d'étude NodeJS Http module_node.js
1, analyse d'ouverture
Tout d'abord, tout le monde doit être familier avec le concept de "Http". Il n'est pas basé sur un langage spécifique. Il s'agit d'un protocole général de couche application. Différents langages ont des détails d'implémentation différents, mais ils restent les mêmes. et les idées sont les mêmes
En tant qu'environnement d'exploitation hôte, NodeJS utilise JavaScript comme langage hôte. Il possède également son propre ensemble de normes de mise en œuvre. Dans cet article, nous découvrirons ensemble le « module HTTP ». Mais comme prémisse,
J'espère que vous pourrez d'abord lire l'API fournie par le site officiel et avoir une pré-compréhension, ce qui sera beaucoup plus pratique. Voici un aperçu de l'API de la partie Http :
HTTP
http.STATUS_CODES
http.createServer([requestListener])
http.createClient([port], [hôte])
Classe : http.Serveur
事件 : 'demande'
事件 : 'connexion'
事件 : 'fermer'
Événement : 'checkContinue'
事件 : 'connecter'
Événement : 'mise à niveau'
Événement : 'clientError'
server.listen(port, [nom d'hôte], [backlog], [callback])
server.listen(chemin, [rappel])
server.listen(handle, [rappel])
serveur.close([rappel])
serveur.maxHeadersCount
server.setTimeout (msecs, rappel)
serveur.timeout
Classe : http.ServerResponse
事件 : 'fermer'
réponse.writeContinue()
réponse.writeHead(statusCode, [reasonPhrase], [headers])
réponse.setTimeout (msecs, rappel)
réponse.statusCode
réponse.setHeader(nom, valeur)
réponse.headersEnvoyé
réponse.sendDate
réponse.getHeader(nom)
réponse.removeHeader(nom)
réponse.write(morceau, [encodage])
réponse.addTrailers(en-têtes)
réponse.end([données], [encodage])
http.request(options, rappel)
http.get(options, rappel)
Classe : http.Agent
nouvel agent([options])
agent.maxSockets
agent.maxFreeSockets
agent.sockets
agent.freeSockets
agent.requests
agent.destroy()
agent.getName(options)
http.globalAgent
Classe : http.ClientRequest
« Réponse » à l'événement
Événement : 'socket'
事件 : 'connecter'
Événement : 'mise à niveau'
Événement : 'continuer'
request.write(morceau, [encodage])
request.end([données], [encodage])
requête.abort()
request.setTimeout(timeout, [callback])
request.setNoDelay([noDelay])
request.setSocketKeepAlive([enable], [initialDelay])
http.IncomingMessage
事件 : 'fermer'
message.httpVersion
message.headers
message.rawHeaders
message.trailers
message.rawTrailers
message.setTimeout (msecs, rappel)
message.méthode
message.url
message.statusCode
message.socket
让我们先从一个简单例子开始,创建一个叫server.js的文件,并写入以下代码:
var http = require('http') ;
var serveur = http.createServer(function(req,res){
res.writeHeader(200,{
'Content-Type' : 'text/plain;charset=utf-8' // Ajouter charset=utf-8
}) ;
res.end("Bonjour Gros Ours!") ;
}) ;
serveur.écouter(8888) ;
console.log("serveur http exécuté sur le port 8888...") ;
(node server.js) Voici les résultats :
2. Exemples d'analyses détaillées
Regardez ce petit exemple en détail :
(Ligne 1) : Présentez le module "http" fourni avec NodeJS via "require" et affectez-le à la variable http.
(2 lignes) : Appelez la fonction fournie par le module http : "createServer". Cette fonction renvoie un nouvel objet serveur Web.
Le paramètre "requestListener" est une fonction qui sera automatiquement ajoutée à la file d'écoute de l'événement "request".
Lorsqu'une requête arrive, Event-Loop placera la fonction de rappel Listener dans la file d'attente d'exécution, et tout le code du nœud sera retiré de la file d'attente d'exécution un par un pour exécution.
Ces exécutions sont toutes effectuées sur le thread de travail (Event Loop lui-même peut être considéré comme étant dans un thread indépendant. Nous ne mentionnons généralement pas ce thread, mais appelons node un environnement d'exécution mono-thread),
Tous les rappels sont exécutés sur un thread de travail.
Reprenons la fonction de rappel "requestListener", qui fournit deux paramètres (requête, réponse),
Lancé à chaque fois qu'une demande est reçue. Notez que chaque connexion peut avoir plusieurs requêtes (dans une connexion persistante).
"request" est une instance de http.IncomingMessage. "response" est une instance de http.ServerResponse.
Un objet de requête http est un flux lisible et un objet de réponse http est un flux inscriptible.
Un objet "IncomingMessage" est créé par http.Server ou http.ClientRequest,
Et passé comme premier paramètre aux événements "request" et "response" respectivement.
Il peut également être utilisé pour accéder à l'état des réponses, aux en-têtes et aux données.
Il implémente l'interface "Stream" et les événements, méthodes et propriétés supplémentaires suivants. (Reportez-vous à l'API pour plus de détails).
(3 lignes) : "writeHeader", utilisez la fonction "response.writeHead()" pour envoyer un statut Http 200 et le type de contenu de l'en-tête Http.
Répondez à l'en-tête de réponse à la demande. "statusCode" est un code d'état HTTP à trois chiffres, tel que 404. Le dernier paramètre, "headers", est le contenu des en-têtes de réponse.
Donnez-moi un exemple :
var body = 'bonjour tout le monde' ;
réponse.writeHead(200, {
'Contenu-Longueur' : corps.longueur,
'Type de contenu' : 'texte/plain'
}) ;
Remarque : la longueur du contenu est calculée en octets et non en caractères.
La raison de l'exemple précédent est que la chaîne "Hello World!" ne contient que des caractères à un octet.
Si le corps contient des caractères codés sur plusieurs octets, vous devez utiliser Buffer.byteLength() pour déterminer le nombre d'octets de la chaîne dans le cas d'un codage de caractères multi-octets.
Il convient d'expliquer en outre que Node ne vérifie pas si l'attribut Content-Lenth correspond à la longueur du corps transmis.
statusCode est un code d'état HTTP à trois chiffres, par exemple : "404". Ce dont je veux parler ici, c'est de "http.STATUS_CODES", qui contient la collection et une brève description de tous les codes d'état de réponse "Http" standard.
Voici la référence du code source :
var STATUS_CODES = exports.STATUS_CODES = {
100 : 'Continuer',
101 : 'Changement de protocole',
102 : 'Traitement', // RFC 2518, obsolète par RFC 4918
200 : 'D'accord',
201 : 'Créé',
202 : 'Accepté',
203 : 'Informations non faisant autorité',
204 : 'Pas de contenu',
205 : 'Réinitialiser le contenu',
206 : 'Contenu partiel',
207 : 'Multi-Statut', // RFC 4918
300 : 'Choix multiples',
301 : 'Déplacé définitivement',
302 : 'Déplacé temporairement',
303 : 'Voir les autres',
304 : 'Non modifié',
305 : 'Utiliser un proxy',
307 : 'Redirection temporaire',
400 : 'Mauvaise demande',
401 : 'Non autorisé',
402 : 'Paiement requis',
403 : 'Interdit',
404 : 'Introuvable',
405 : 'Méthode non autorisée',
406 : 'Non Acceptable',
407 : 'Authentification proxy requise',
408 : 'Demander un délai d'attente',
409 : 'Conflit',
410 : 'Parti',
411 : 'Longueur requise',
412 : 'Échec de la précondition',
413 : 'Demande d'entité trop grande',
414 : 'Demande-URI trop grande',
415 : 'Type de média non pris en charge',
416 : 'Plage demandée non satisfaisante',
417 : 'L'attente a échoué',
418 : 'Je suis une théière', // RFC 2324
422 : 'Entité non traitable', // RFC 4918
423 : 'Verrouillé', // RFC 4918
424 : 'Échec de la dépendance', // RFC 4918
425 : 'Collection non ordonnée', // RFC 4918
426 : 'Mise à niveau requise', // RFC 2817
500 : 'Erreur interne du serveur',
501 : 'Non implémenté',
502 : 'Mauvaise passerelle',
503 : 'Service indisponible',
504 : 'Délai d'expiration de la passerelle',
505 : 'Version HTTP non prise en charge',
506 : 'La variante négocie également', // RFC 2295
507 : 'Stockage insuffisant', // RFC 4918
509 : 'Limite de bande passante dépassée',
510 : 'Non étendu' // RFC 2774
};
节选自,Nodejs源码 ”http.js“ 143行开始。
其实从客户端应答结果也不难看出:
(6行):”response.end“------当所有的响应报头和报文被发送完成时这个方法将信号发送给服务器。服务器会认为这个消息完成了。
每次响应完成之后必须调用该方法。如果指定了参数 « data » , et aussi «response.write(data, encoding)» Il s'agit de «response.end()» 。
(8行):”server.listen(8888)“ ------ 服务器用指定的句柄接受连接,绑定在特定的端口。
以上就是一个比较详细的分析过程,希望有助于加深理解,代码虽然不多,但是重在理解一些细节机制,以便日后高效的开发NodeJS应用。
三,实例
除了可以使用 "demande" et "demande"数据。
这是一个"POST"请求的例子:
http.createServer(fonction (demande, réponse) {
var corps = [];
console.log(request.method) ;
console.log(request.headers) ;
Request.on('data', fonction (morceau) {
body.push(chunk);
}) ;
Request.on('end', function() {
corps = Buffer.concat(corps);
console.log(body.toString()) ;
});
}).écouter(8888) ;
Ce qui suit est le contenu complet des données de la requête "Http".
POST/HTTP/1.1
Agent utilisateur : curl/7.26.0
Hôte : localhost
Accepter : */*
Longueur du contenu : 11
Type de contenu : application/x-www-form-urlencoded
Bonjour tout le monde
Quatre, résumé
(1), comprendre le concept de "Http".
(2), maîtriser l'utilisation des API liées à "Http".
(3) Faites attention aux détails, tels que les détails du traitement entre « POST, GET ».
(4), compréhension de "requestListener".
(5), met l'accent sur un concept : un objet de requête http est un flux lisible, et un objet de réponse http est un flux inscriptible.

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Les principales différences entre Node.js et Tomcat sont : Runtime : Node.js est basé sur le runtime JavaScript, tandis que Tomcat est un conteneur de servlet Java. Modèle d'E/S : Node.js utilise un modèle asynchrone non bloquant, tandis que Tomcat est un modèle de blocage synchrone. Gestion de la concurrence : Node.js gère la concurrence via une boucle d'événements, tandis que Tomcat utilise un pool de threads. Scénarios d'application : Node.js convient aux applications en temps réel, gourmandes en données et à forte concurrence, et Tomcat convient aux applications Web Java traditionnelles.

Node.js est un environnement d'exécution JavaScript côté serveur, tandis que Vue.js est un framework JavaScript côté client permettant de créer des interfaces utilisateur interactives. Node.js est utilisé pour le développement côté serveur, comme le développement d'API de service back-end et le traitement des données, tandis que Vue.js est utilisé pour le développement côté client, comme les applications monopage et les interfaces utilisateur réactives.

Node.js peut être utilisé comme framework backend car il offre des fonctionnalités telles que des performances élevées, l'évolutivité, la prise en charge multiplateforme, un écosystème riche et une facilité de développement.

Il existe deux fichiers liés à npm dans le répertoire d'installation de Node.js : npm et npm.cmd. Les différences sont les suivantes : différentes extensions : npm est un fichier exécutable et npm.cmd est un raccourci de fenêtre de commande. Utilisateurs Windows : npm.cmd peut être utilisé à partir de l'invite de commande, npm ne peut être exécuté qu'à partir de la ligne de commande. Compatibilité : npm.cmd est spécifique aux systèmes Windows, npm est disponible multiplateforme. Recommandations d'utilisation : les utilisateurs Windows utilisent npm.cmd, les autres systèmes d'exploitation utilisent npm.

Oui, Node.js est un langage de développement backend. Il est utilisé pour le développement back-end, notamment la gestion de la logique métier côté serveur, la gestion des connexions à la base de données et la fourniture d'API.

Les variables globales suivantes existent dans Node.js : Objet global : global Module principal : processus, console, nécessiter Variables d'environnement d'exécution : __dirname, __filename, __line, __column Constantes : undefined, null, NaN, Infinity, -Infinity

Pour vous connecter à une base de données MySQL, vous devez suivre ces étapes : Installez le pilote mysql2. Utilisez mysql2.createConnection() pour créer un objet de connexion contenant l'adresse de l'hôte, le port, le nom d'utilisateur, le mot de passe et le nom de la base de données. Utilisez connection.query() pour effectuer des requêtes. Enfin, utilisez connection.end() pour mettre fin à la connexion.

Node.js et Java ont chacun leurs avantages et leurs inconvénients en matière de développement Web, et le choix dépend des exigences du projet. Node.js excelle dans les applications en temps réel, le développement rapide et l'architecture de microservices, tandis que Java excelle dans la prise en charge, les performances et la sécurité de niveau entreprise.
