1. Analyse d'ouverture
Tout d'abord, tout le monde devrait être familier avec le concept de "HTTP". Il n'est pas basé sur une langue spécifique, mais est un protocole de couche d'application générale. Différentes langues ont des détails de mise en œuvre différents, mais ils sont conformes à leurs principes et les idées sont les mêmes.
En tant qu'environnement d'exécution d'hôte, NodeJS utilise JavaScript comme langage hôte et a également son propre ensemble de normes implémentées. Dans cet article, apprenons 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 compréhension préliminaire, ce qui le rendra beaucoup plus pratique. Ce qui suit est un aperçu de l'API dans la partie HTTP:
La copie de code est la suivante:
Http
http.status_codes
http.createServer ([requestListener])
http.createClient ([port], [hôte])
Classe: http.server
Événement: «demande»
Événement: «connexion»
Événement: «Fermer»
Événement: «Contrôler Continue»
Événement: «Connexion»
Événement: «mise à niveau»
Événement: «ClientError»
server.Listen (port, [nom d'hôte], [backlog], [rappel])
server.Listen (chemin, [rappel])
server.Listen (manche, [rappel])
server.close ([rappel])
server.maxhederscount
server.setTimeout (msecs, rappel)
serveur.
Classe: http.serverResponse
Événement: «Fermer»
réponse.WriteContinue ()
Response.WriteHead (Statuscode, [RaisonPhrase], [En-têtes])
Response.SetTimeout (MSECS, rappel)
réponse.
Response.Setheader (nom, valeur)
réponse.
réponse.senddate
Response.getheader (nom)
Response.RemoveHeader (nom)
Response.Write (Chunk, [Encoding])
réponse.Addtrailers (en-têtes)
réponse.end ([données], [codage])
http.request (options, rappel)
http.get (options, rappel)
Classe: http.agent
nouvel agent ([options])
agent.maxsockets
agent.maxfreesockets
sachets d'agent
agent.freesocket
Agent.Requests
agent.destroy ()
Agent.getName (Options)
http.globalagent
Classe: http.clientRequest
Événement 'réponse'
Événement: 'socket'
Événement: «Connexion»
Événement: «mise à niveau»
Événement: «Continuer»
request.write (Chunk, [Encoding])
request.end ([data], [codage])
request.abort ()
request.setTimeout (temps mort, [rappel])
request.setNodelay ([nodelay])
request.SetSocketKeepalive ([activer], [initialDelay])
http.incomingMessage
Événement: «Fermer»
message.httpversion
Message.
Message.Rawheaders
Message.trailers
Message.Rawtrailers
message.setTimeout (MSECS, rappel)
message.method
message.url
message.staturus
message.
Commençons par un exemple simple, créons un fichier appelé server.js et écrivons le code suivant:
La copie de code est la suivante:
var http = require ('http');
var server = http.createServer (fonction (req, res) {
res.writeHeader (200, {
'Content-Type': 'Text / PLAIN; charset = utf-8' // ajouter charset = utf-8
});
res.end ("Bonjour, Big Bear!");
});
server.Listen (8888);
console.log ("Http Server fonctionnant sur le port 8888 ...");
(Node Server.js) Ce qui suit est le résultat en cours:
2. Exemples d'analyse détaillées
Jetons un coup d'œil à ce petit exemple:
(Ligne 1): Introduisez le module "HTTP" qui est livré avec NodeJS via "require" et attribuez-le à la variable HTTP.
(2 lignes): Appelez la fonction fournie par le module HTTP: "CreateServer". Cette fonction renvoie un nouvel objet de serveur Web.
Le paramètre "RequestListener" est une fonction qui sera automatiquement ajoutée à la file d'attente d'écoute de l'événement "Demande".
Lorsqu'une demande arrive, l'événement-boucle mettra la fonction de rappel de l'écoute dans la file d'attente d'exécution, et tout le code du nœud est exécuté un par un à partir de la file d'attente d'exécution.
Ces exécutions sont toutes sur le thread des travailleurs (la boucle d'événement elle-même peut être considérée comme étant dans un thread indépendant. Nous ne mentionnons généralement pas ce fil, mais l'appel nœud un environnement d'exécution unique).
Tous les rappels sont exécutés sur un fil de travail.
Jetons un coup d'œil à la fonction de rappel "RequestListener", qui fournit deux paramètres (demande, réponse).
Déclenché chaque fois qu'une demande est reçue. Notez que chaque connexion peut avoir plusieurs demandes (dans les connexions de conservation).
"Demande" est une instance de http.incomingMessage. "Response" est une instance de Http.ServerResponse.
Un objet de demande HTTP est un flux lisible, tandis qu'un objet de réponse HTTP est un flux écrite.
Un objet "IntomingMessage" est créé par http.server ou http.clientRequest.
Et passer comme le premier paramètre aux événements "Demande" et "Response" respectivement.
Il peut également être utilisé pour accéder à l'état, les fichiers d'en-tête et les données de la réponse.
Il implémente l'interface "Stream" ainsi que 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 (Type de contenu).
Répondre à l'en-tête de demande. "StatusCode" est un code d'état HTTP trois bits, tel que 404. Le dernier paramètre, "En-têtes", est le contenu de l'en-tête de réponse.
Prenez un châtaignier:
La copie de code est la suivante:
var body = 'Hello World';
réponse.Writehead (200, {
«Content-Length»: Body.Length,
«Type de contenu»: «Texte / Plain»
});
Remarque: la longueur de contenu est calculée en octets, pas 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 à plusieurs gobets, Buffer.ByteLength () doit être utilisé pour déterminer le nombre d'octets de la chaîne dans le cas d'un codage de caractères multi -yte.
Il faut en outre expliquer que le nœud ne vérifie pas si l'attribut de contenu-Lenth correspond à la longueur du corps transmise.
StatusCode est un code d'état HTTP trois bits, par exemple: "404". Ce que je veux parler ici, c'est "http.status_codes", tous les ensembles et les descriptions courtes des codes d'état de réponse "HTTP" standard sont inclus.
Ce qui suit est la référence du code source:
La copie de code est la suivante:
var status_codes = exports.status_codes = {
100: «Continuer»,
101: «Protocoles de commutation»,
102: «traitement», // RFC 2518, obsolète par RFC 4918
200: 'ok',
201: «créé»,
202: «accepté»,
203: «Informations non autoritaires»,
204: «Pas de contenu»,
205: «Réinitialiser le contenu»,
206: «Contenu partiel»,
207: «Multi-status», // RFC 4918
300: «Choix multiples»,
301: «déplacé en permanence»,
302: «ému temporairement»,
303: «Voir les autres»,
304: «non modifié»,
305: «Utiliser le proxy»,
307: «Redirection temporaire»,
400: «mauvaise demande»,
401: «non autorisé»,
402: «Paiement requis»,
403: «interdit»,
404: «non trouvé»,
405: «Méthode non autorisée»,
406: «non acceptable»,
407: «Authentification proxy requise»,
408: «Demander un délai de sortie»,
409: «conflit»,
410: «parti»,
411: «Longueur requise»,
412: «Échec de la condition préalable»,
413: «Demande d'entité trop grande»,
414: «Demande-Uri trop grande»,
415: «Type de média non soutenu»,
416: «La plage demandée n'est pas satisfaisante»,
417: «L'attente a échoué»,
418: 'i /' ma taapot ', // rfc 2324
422: «Entité non résolue», // 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 du serveur interne»,
501: «non implémenté»,
502 Mauvaise passerelle',
503: «Service indisponible»,
504: «Gateway Time-Out»,
505: «Version HTTP non prise en charge»,
506: «Variant négocie également», // RFC 2295
507: «stockage insuffical», // RFC 4918
509: «Limite de bande passante dépassée»,
510: «non étendu» // RFC 2774
};
Extrait du code source NodeJS "http.js" commence par la ligne 143.
En fait, il n'est pas difficile de voir dans le résultat de la réponse du client:
(6 lignes): "Response.end" ------ Lorsque tous les en-têtes et messages de réponse sont envoyés, cette méthode envoie le signal au serveur. Le serveur pensera que le message est terminé.
Cette méthode doit être appelée une fois chaque réponse terminée. Si le paramètre "données" est spécifié, il équivaut à appeler "Response.write (données, codage)" d'abord, puis appeler "Response.end ()".
(8 lignes): "Server.Listen (8888)" ----- Le serveur accepte les connexions avec la poignée spécifiée et se lie à un port spécifique.
Ce qui précède est un processus d'analyse plus détaillé, dans l'espoir d'aider à approfondir la compréhension. Bien qu'il n'y ait pas beaucoup de code, l'accent est mis sur la compréhension de certains mécanismes détaillés afin que les applications NodeJS puissent être développées efficacement à l'avenir.
Trois, des exemples
En plus d'utiliser l'objet "Demande" pour accéder aux données d'en-tête de demande, l'objet "Demande" peut également être utilisé comme flux de données en lecture seule pour accéder aux données du corps de la demande.
Voici un exemple de demande "post":
La copie de code est la suivante:
http.createServer (fonction (demande, réponse) {
var corps = [];
console.log (request.method);
Console.log (request.headers);
request.on ('data', fonction (chunk) {
body.push (morceau);
});
request.on ('end', function () {
body = buffer.concat (corps);
console.log (body.toString ());
});
}). écouter (8888);
Vous trouverez ci-dessous un contenu complet de données de demande "HTTP".
La copie de code est la suivante:
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 le monde
Quatre, résumons
(1) Comprendre le concept de "http".
(2) compétent dans l'utilisation des API liées à "http".
(3) Faites attention au contrôle des détails, tels que: les détails de traitement entre "Post, Get".
(4), compréhension de "RequestListener".
(5).