recherche
Maisoninterface Webjs tutorielNotes 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 :

Copier le code Le code est le suivant :

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 :

Copier le code Le code est le suivant :

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 :

Copier le code Le code est le suivant :

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".

Copier le code Le code est le suivant :

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.

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
JavaScript: Explorer la polyvalence d'un langage WebJavaScript: Explorer la polyvalence d'un langage WebApr 11, 2025 am 12:01 AM

JavaScript est le langage central du développement Web moderne et est largement utilisé pour sa diversité et sa flexibilité. 1) Développement frontal: construire des pages Web dynamiques et des applications à une seule page via les opérations DOM et les cadres modernes (tels que React, Vue.js, Angular). 2) Développement côté serveur: Node.js utilise un modèle d'E / S non bloquant pour gérer une concurrence élevée et des applications en temps réel. 3) Développement des applications mobiles et de bureau: le développement de la plate-forme multiplateuse est réalisé par réact noral et électron pour améliorer l'efficacité du développement.

L'évolution de JavaScript: tendances actuelles et perspectives d'avenirL'évolution de JavaScript: tendances actuelles et perspectives d'avenirApr 10, 2025 am 09:33 AM

Les dernières tendances de JavaScript incluent la montée en puissance de TypeScript, la popularité des frameworks et bibliothèques modernes et l'application de WebAssembly. Les prospects futurs couvrent des systèmes de type plus puissants, le développement du JavaScript côté serveur, l'expansion de l'intelligence artificielle et de l'apprentissage automatique, et le potentiel de l'informatique IoT et Edge.

Démystifier javascript: ce qu'il fait et pourquoi c'est importantDémystifier javascript: ce qu'il fait et pourquoi c'est importantApr 09, 2025 am 12:07 AM

JavaScript est la pierre angulaire du développement Web moderne, et ses principales fonctions incluent la programmation axée sur les événements, la génération de contenu dynamique et la programmation asynchrone. 1) La programmation axée sur les événements permet aux pages Web de changer dynamiquement en fonction des opérations utilisateur. 2) La génération de contenu dynamique permet d'ajuster le contenu de la page en fonction des conditions. 3) La programmation asynchrone garantit que l'interface utilisateur n'est pas bloquée. JavaScript est largement utilisé dans l'interaction Web, les applications à une page et le développement côté serveur, améliorant considérablement la flexibilité de l'expérience utilisateur et du développement multiplateforme.

Python ou JavaScript est-il meilleur?Python ou JavaScript est-il meilleur?Apr 06, 2025 am 12:14 AM

Python est plus adapté à la science des données et à l'apprentissage automatique, tandis que JavaScript est plus adapté au développement frontal et complet. 1. Python est connu pour sa syntaxe concise et son écosystème de bibliothèque riche, et convient à l'analyse des données et au développement Web. 2. JavaScript est le cœur du développement frontal. Node.js prend en charge la programmation côté serveur et convient au développement complet.

Comment installer JavaScript?Comment installer JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript ne nécessite pas d'installation car il est déjà intégré à des navigateurs modernes. Vous n'avez besoin que d'un éditeur de texte et d'un navigateur pour commencer. 1) Dans l'environnement du navigateur, exécutez-le en intégrant le fichier HTML via des balises. 2) Dans l'environnement Node.js, après avoir téléchargé et installé Node.js, exécutez le fichier JavaScript via la ligne de commande.

Comment envoyer des notifications avant le début d'une tâche en quartz?Comment envoyer des notifications avant le début d'une tâche en quartz?Apr 04, 2025 pm 09:24 PM

Comment envoyer à l'avance des notifications de tâches en quartz lors de l'utilisation du minuteur de quartz pour planifier une tâche, le temps d'exécution de la tâche est défini par l'expression CRON. Maintenant...

Dans JavaScript, comment obtenir des paramètres d'une fonction sur une chaîne prototype dans un constructeur?Dans JavaScript, comment obtenir des paramètres d'une fonction sur une chaîne prototype dans un constructeur?Apr 04, 2025 pm 09:21 PM

Comment obtenir les paramètres des fonctions sur les chaînes prototypes en JavaScript dans la programmation JavaScript, la compréhension et la manipulation des paramètres de fonction sur les chaînes prototypes est une tâche commune et importante ...

Quelle est la raison de la défaillance du déplacement de style dynamique Vue.js dans le WECHAT Mini Program WebView?Quelle est la raison de la défaillance du déplacement de style dynamique Vue.js dans le WECHAT Mini Program WebView?Apr 04, 2025 pm 09:18 PM

Analyse de la raison pour laquelle la défaillance du déplacement de style dynamique de l'utilisation de Vue.js dans la vue Web de l'applet WeChat utilise Vue.js ...

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

Adaptateur de serveur SAP NetWeaver pour Eclipse

Adaptateur de serveur SAP NetWeaver pour Eclipse

Intégrez Eclipse au serveur d'applications SAP NetWeaver.

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP