1. Öffnungsanalyse
Zunächst sollte jeder mit dem Konzept von "HTTP" vertraut sein. Es basiert nicht auf einer bestimmten Sprache, sondern ist ein allgemeines Anwendungsschichtprotokoll. Unterschiedliche Sprachen haben unterschiedliche Implementierungsdetails, stimmen jedoch mit ihren Prinzipien überein und die Ideen sind gleich.
Als Host -Running -Umgebung verwendet NodeJS JavaScript als Host -Sprache und verfügt auch über eigene Standards. Lassen Sie uns in diesem Artikel gemeinsam das „HTTP -Modul“ kennenlernen. Aber als Prämisse,
Ich hoffe, Sie können die API zuerst von der offiziellen Website lesen und ein vorläufiges Verständnis haben, was sie viel bequemer macht. Das Folgende ist ein Überblick über die API im HTTP -Teil:
Die Codekopie lautet wie folgt:
Http
http.status_codes
http.createServer ([RequestListener])
http.createclient ([Port], [Host])
Klasse: http.server
Ereignis: 'Anfrage'
Ereignis: "Verbindung"
Ereignis: 'Close'
Ereignis: 'checkContinue'
Ereignis: 'Connect' '
Ereignis: 'Upgrade'
Ereignis: 'ClientError'
Server.Listen (Port, [Hostname], [Backlog], [Callback])
Server.Listen (Pfad, [Rückruf])
Server.Listen (Handle, [Rückruf])
server.close ([Rückruf])
server.maxHeadersCount
Server.Settimeout (MSECS, Callback)
server.timeout
Klasse: http.serverresponse
Ereignis: 'Close'
response.writeContinue ()
response.writeHead (Statuscode, [Reasonphrase], [Header])
Antwort.Settimeout (MSECS, Rückruf)
response.statuscode
response.setheader (Name, Wert)
Reaktion.HeaderSent
response.senddate
Antwort.Getheader (Name)
Antwort.RemoveHeader (Name)
Antwort.Write (Chunk, [Codierung])
response.addtrailer (Header)
Antwort.end ([Daten], [Codierung])
http.request (Optionen, Rückruf)
http.get (Optionen, Rückruf)
Klasse: http.agent
neuer Agent ([Optionen])
Agent.MaxSockets
Agent.MaxFreesockets
Agent.Sockets
Agent.Freesockets
Agent.Requests
Agent.Destroy ()
Agent.getName (Optionen)
http.globalagent
Klasse: http.clientRequest
Ereignis "Antwort"
Ereignis: 'Sockel' '
Ereignis: 'Connect' '
Ereignis: 'Upgrade'
Veranstaltung: 'Weiter' '
Request.Write (Chunk, [Codierung])
Request.end ([Daten], [Codierung])
request.abort ()
Request.Settimeout (Timeout, [Rückruf])
request.setnodelay ([nodelay])
Request.Setsocketkeepalive ([Enable], [initialdElay])
http.incomingmessage
Ereignis: 'Close'
message.httpversion
Message.Headerers
message.rawHeaders
message.trailer
message.rawtrailer
Message.Settimeout (MSECS, Rückruf)
Message.Method
message.url
message.statuscode
Message.Socket
Beginnen wir mit einem einfachen Beispiel, erstellen Sie eine Datei namens Server.js und schreiben Sie den folgenden Code:
Die Codekopie lautet wie folgt:
var http = required ('http');
var server = http.createServer (Funktion (req, res) {
Res.WriteHeader (200, {
'Inhaltstyp': 'text/plain; charset = utf-8' // fügen Sie charset = utf-8 hinzu
});
res.end ("Hallo, Big Bear!");
});
Server.Listen (8888);
console.log ("HTTP -Server, der auf Port 8888 ausgeführt wird ...");
(Node Server.js) Das Folgende ist das laufende Ergebnis:
2. Beispiele für detaillierte Analyse
Schauen wir uns dieses kleine Beispiel an:
(Zeile 1): Führen Sie das "HTTP" -Modul ein, das mit NodeJs durch "Reforde" geliefert wird, und weisen Sie es der HTTP -Variablen zu.
(2 Zeilen): Rufen Sie die vom HTTP -Modul bereitgestellte Funktion auf: "createServer". Diese Funktion gibt ein neues Webserverobjekt zurück.
Der Parameter "RequestListener" ist eine Funktion, die automatisch zur Hörwarteschlange des Ereignisses "Anfrage" hinzugefügt wird.
Wenn eine Anfrage eintrifft, wird Event-Loop die Listener-Rückruffunktion in die Ausführungswarteschlange einfügen, und der gesamte Code im Knoten wird nacheinander aus der Ausführungswarteschlange ausgeführt.
Diese Ausführungen befinden sich alle auf dem Arbeiter-Thread (Ereignisschleife selbst kann als in einem unabhängigen Thread angesehen werden. Wir erwähnen diesen Thread im Allgemeinen nicht, sondern rufen den Knoten in einer Einzel-Thread-Ausführungsumgebung an).
Alle Rückrufe werden auf einem Arbeiter -Thread ausgeführt.
Schauen wir uns die Rückruffunktion "RequestListener" an, die zwei Parameter (Anfrage, Antwort) enthält.
Jedes Mal ausgelöst, wenn eine Anfrage empfangen wird. Beachten Sie, dass jede Verbindung mehrere Anfragen aufweist (in Keep-Alive-Verbindungen).
"Anfrage" ist eine Instanz von http.incomingMessage. "Antwort" ist eine Instanz von http.serverresponse.
Ein HTTP -Anforderungsobjekt ist ein lesbarer Stream, während ein HTTP -Antwortobjekt ein beschreibbarer Stream ist.
Ein "IncomingMessage" -Objekt wird von http.server oder http.clientRequest erstellt.
Und übergeben Sie als erster Parameter an die Ereignisse "Anfrage" und "Antwort".
Es kann auch verwendet werden, um auf Status, Header -Dateien und Daten der Antwort zugreifen zu können.
Es implementiert die Schnittstelle "Stream" sowie die folgenden zusätzlichen Ereignisse, Methoden und Eigenschaften. (Weitere Informationen finden Sie in API).
(3 Zeilen): "WriteHeader", Verwenden Sie die Funktion "response.writehead ()", um einen HTTP-Status 200 und den Inhaltstyp des HTTP-Headers (Inhaltstyp) zu senden.
Antworten Sie auf den Anfrage -Header. "StatusCode" ist ein Drei-Bit-HTTP-Statuscode wie 404. Der letzte Parameter "Header" ist der Inhalt des Antwortheaders.
Nehmen Sie eine Kastanie:
Die Codekopie lautet wie folgt:
var body = 'Hallo Welt';
Antwort.WriteHead (200, {
'Inhaltslänge': Body.Length,
'Inhaltstyp': 'Text/Ebene'
});
Hinweis: Die Inhaltslänge wird in Bytes berechnet, nicht in Zeichen.
Der Grund für das vorherige Beispiel ist, dass die Zeichenfolge "Hallo Welt!" Enthält nur Single-Byte-Zeichen.
Wenn der Körper mit mehreren kodierten Zeichen enthält, sollte Buffer.ByTelength () verwendet werden, um die Anzahl der Bytes der Zeichenfolge bei einer Multibyte-Zeichencodierung zu bestimmen.
Es sollte ferner erklärt werden, dass der Knoten nicht überprüft, ob das inhalts-lenth-Attribut der übertragenen Körperlänge übereinstimmt.
StatusCode ist ein Drei-Bit-HTTP-Statuscode, zum Beispiel: "404". Was ich hier sprechen möchte, ist "http.status_codes", alle Sets und kurzen Beschreibungen des Standard -"-Kodus" HTTP "sind enthalten.
Das Folgende ist die Quellcode -Referenz:
Die Codekopie lautet wie folgt:
var status_codes = expors.status_codes = {{
100: 'Weiter',
101: 'Schaltprotokolle', ','
102: 'Processing', // RFC 2518, von RFC 4918 veraltet
200: 'OK',,
201: 'erstellt',
202: 'akzeptiert',
203: "Nichtautoritative Informationen",
204: 'kein Inhalt',
205: 'Inhalt zurücksetzen',
206: 'Teilinhalt',
207: 'Multi-Status', // RFC 4918
300: 'Mehrere Auswahlmöglichkeiten',
301: 'dauerhaft bewegt',
302: 'vorübergehend bewegt',
303: 'Siehe Andere',
304: 'nicht modifiziert',
305: "Verwenden Sie Proxy",
307: 'Temporäre Weiterleitungen',
400: 'schlechte Anfrage',
401: 'nicht autorisiert',
402: 'Zahlung erforderlich',
403: 'Verboten',
404: 'nicht gefunden',
405: 'Methode nicht erlaubt',
406: 'nicht akzeptabel',
407: 'Proxy -Authentifizierung erforderlich',
408: 'Anfrage Time-Out',
409: 'Konflikt',
410: 'gegangen',,
411: 'Länge erforderlich',
412: 'Voraussetzung fehlgeschlagen',
413: 'Anfrage Entity zu groß',
414: "Anfrage-uri zu groß",
415: 'nicht unterstützter Medientyp',
416: 'Angeforderter Bereich nicht zufriedenbar',
417: 'Erwartung fehlgeschlagen',
418: 'I/' Ma Teapot ', // RFC 2324
422: 'unverarbeitbare Entität', // RFC 4918
423: 'gesperrt', // RFC 4918
424: 'fehlgeschlagene Abhängigkeit', // RFC 4918
425: 'ungeordnete Sammlung', // RFC 4918
426: 'Upgrade erforderlich', // RFC 2817
500: 'interner Serverfehler',
501: 'nicht implementiert',
502: 'schlechtes Gateway',
503: 'Service nicht verfügbar',
504: 'Gateway Time-Out',
505: 'HTTP -Version nicht unterstützt',
506: "Variante verhandelt auch", // RFC 2295
507: 'Unsufficial Storage', // RFC 4918
509: 'Bandbreitengrenze übertroffen', ','
510: 'nicht erweitert' // RFC 2774
};
Aus dem NodeJS -Quellcode "http.js" aus dem NodeJS -Quellcode beginnt mit Zeile 143.
Tatsächlich ist es nicht schwierig, das Ergebnis der Kundenreaktion zu erkennen:
(6 Zeilen): "Antwort.end" ------ Wenn alle Antwort-Header und Nachrichten gesendet werden, sendet diese Methode das Signal an den Server. Der Server wird glauben, dass die Nachricht abgeschlossen ist.
Diese Methode muss aufgerufen werden, nachdem jede Antwort abgeschlossen ist. Wenn der Parameter "Daten" angegeben ist, entspricht es dem Aufrufen von "Antwort" (Schreiben Sie Daten, Codierung) "zuerst und dann" Antwort ".end () ".
(8 Zeilen): "Server.Listen (8888)" ----- Der Server akzeptiert Verbindungen zum angegebenen Handle und bindet an einen bestimmten Port.
Das obige ist ein detaillierterer Analyseprozess, in der Hoffnung, das Verständnis zu vertiefen. Obwohl es nicht viel Code gibt, liegt der Fokus darauf, einige detaillierte Mechanismen zu verstehen, so dass NodeJS -Anwendungen in Zukunft effizient entwickelt werden können.
Drei Beispiele
Zusätzlich zur Verwendung des Objekts "Anfrage" zum Zugriff auf die Anforderungsheaderdaten kann das "Anfrage" -Objekt auch als schreibgeschütztes Datenstrom verwendet werden, um auf die Anforderungsgremiendaten zuzugreifen.
Hier ist ein Beispiel für eine "Post" -Anfrage:
Die Codekopie lautet wie folgt:
http.createServer (Funktion (Anfrage, Antwort) {
var body = [];
console.log (request.method);
console.log (request.Headerers);
Request.on ('Daten', Funktion (Chunk) {
Body.push (Chunk);
});
request.on ('end', function () {
body = buffer.concat (Körper);
console.log (body.tostring ());
});
}). Hören (8888);
Nachfolgend finden Sie einen vollständigen "HTTP" -Anforderungsdateninhalt.
Die Codekopie lautet wie folgt:
Post/HTTP/1.1
Benutzer-Agent: Curl/7.26.0
Host: Localhost
Akzeptieren: */*
Inhaltslänge: 11
Inhaltstyp: Anwendung/x-www-form-urlencoded
Hallo Welt
Vier, lasst uns zusammenfassen
(1) Verstehen Sie das Konzept von "http".
(2) Kenntnisse in der Verwendung von "http" -bezogenen APIs.
(3) Achten Sie auf die Kontrolle über Details, wie z. B. die Verarbeitungsdetails zwischen "Post, Get".
(4), Verständnis von "RequestListener".
(5) betonen ein Konzept: Ein HTTP -Anforderungsobjekt ist ein lesbarer Stream, während ein HTTP -Antwortobjekt ein beschreibbarer Stream ist.