1. Análisis de apertura
En primer lugar, todos deberían estar familiarizados con el concepto de "HTTP". No se basa en un lenguaje específico, pero es un protocolo general de la capa de aplicación. Los diferentes idiomas tienen diferentes detalles de implementación, pero son consistentes con sus principios y las ideas son las mismas.
Como entorno de ejecutar host, NodeJS usa JavaScript como lenguaje host y también tiene su propio conjunto de estándares implementados. En este artículo, aprendamos sobre el "módulo HTTP" juntos. Pero como una premisa,
Espero que pueda leer primero la API proporcionada por el sitio web oficial y tener una comprensión preliminar, lo que lo hará mucho más conveniente. La siguiente es una descripción general de la API en la parte HTTP:
La copia del código es la siguiente:
Http
http.status_codes
http.createServer ([requestListener])
http.createClient ([puerto], [host])
Clase: http.server
Evento: 'Solicitar'
Evento: 'Conexión'
Evento: 'Cerrar'
Evento: 'Comprobación de cheque'
Evento: 'conectar'
Evento: 'Actualizar'
Evento: 'ClientError'
server.listen (puerto, [hostname], [backlog], [devolución de llamada])
server.listen (ruta, [devolución de llamada])
Server.listen (Handle, [devolución de llamada])
Server.Close ([devolución de llamada])
servidor.maxheaderscount
Server.setTimeOut (msecs, devolución de llamada)
servidor.timeout
Clase: http.ServerResponse
Evento: 'Cerrar'
respuesta.writeContinue ()
Response.Writehead (StatusCode, [razonfrase], [encabezados])
Response.setTimeOut (msecs, devolución de llamada)
respuesta.statuscode
Respuesta.Setheader (nombre, valor)
respuesta.
Respuesta.senddate
Response.Getheader (nombre)
Response.removeheader (nombre)
Response.write (fragmento, [codificación])
Respuesta. AddRailers (encabezados)
Response.end ([datos], [codificación])
http.request (opciones, devolución de llamada)
http.get (opciones, devolución de llamada)
Clase: http.agent
nuevo agente ([opciones])
agente.maxsockets
agente.maxfreesockets
agente.
agente.freesockets
agente. Requests
agente.destroy ()
agente.getName (opciones)
http.globalagent
Clase: http.clientRequest
Evento 'Respuesta'
Evento: 'Socket'
Evento: 'conectar'
Evento: 'Actualizar'
Evento: 'Continuar'
request.write (fragmento, [codificación])
request.end ([datos], [codificación])
request.abort ()
request.setTimeOut (tiempo de espera, [devolución de llamada])
request.setNodelay ([nodelay])
request.setsocketkeepalive ([enable], [initialDelay])
http.incomingmessage
Evento: 'Cerrar'
mensaje.httpversion
mensaje.
Message.RawHeaders
Message.Railers
Message.Rawtrailers
Message.setTimeout (msecs, devolución de llamada)
mensaje.method
Message.url
Message.statuscode
mensaje.socket
Comencemos con un ejemplo simple, cree un archivo llamado servidor.js y escribamos el siguiente código:
La copia del código es la siguiente:
var http = require ('http');
var server = http.createServer (function (req, res) {
Res.WriteHeader (200, {
'Content-type': 'Text/Plain; Charset = UTF-8' // Agregar charset = utf-8
});
res.end ("¡Hola, Big Bear!");
});
servidor.listen (8888);
console.log ("servidor HTTP que se ejecuta en el puerto 8888 ...");
(Node Server.js) El siguiente es el resultado en ejecución:
2. Ejemplos de análisis detallados
Echemos un vistazo a este pequeño ejemplo:
(Línea 1): introduzca el módulo "HTTP" que viene con NodeJS a través de "Requerir" y asignarlo a la variable HTTP.
(2 líneas): llame a la función proporcionada por el módulo HTTP: "CreateServer". Esta función devuelve un nuevo objeto de servidor web.
El parámetro "RequestListener" es una función que se agregará automáticamente a la cola de escucha del evento "Solicitud".
Cuando llega una solicitud, Event-Loop colocará la función de devolución de llamada del oyente en la cola de ejecución, y todo el código en el nodo se ejecuta uno por uno desde la cola de ejecución.
Todas estas ejecuciones están en el hilo de trabajadores (el bucle de eventos en sí mismo puede considerarse como en un hilo independiente. Generalmente no mencionamos este hilo, pero llamamos al nodo como un entorno de ejecución de un solo thread).
Todas las devoluciones de llamada se ejecutan en un hilo de trabajadores.
Echemos un vistazo a la función de devolución de llamada "RequestListener", que proporciona dos parámetros (solicitud, respuesta).
Activado cada vez que se recibe una solicitud. Tenga en cuenta que cada conexión puede tener múltiples solicitudes (en conexiones Keep-Alive).
"Solicitar" es una instancia de http.incomingMessage. "Respuesta" es una instancia de http.ServerResponse.
Un objeto de solicitud HTTP es una secuencia legible, mientras que un objeto de respuesta HTTP es un flujo de escritura.
Un objeto "entrante" es creado por http.server o http.clientRequest.
Y pase como el primer parámetro para los eventos "Solicitar" y "Respuesta" respectivamente.
También se puede utilizar para acceder al estado, los archivos de encabezado y los datos de la respuesta.
Implementa la interfaz de "transmisión", así como los siguientes eventos, métodos y propiedades adicionales. (Consulte API para obtener más detalles).
(3 líneas): "WriteHeader", use la función "Response.Writehead ()" para enviar un estado HTTP 200 y el tipo de contenido del encabezado HTTP (tipo de contenido).
Responder al encabezado de solicitud. "Statuscode" es un código de estado HTTP de tres bits, como 404. El último parámetro, "encabezados", es el contenido del encabezado de respuesta.
Toma una castaña:
La copia del código es la siguiente:
var cuerpo = 'hola mundo';
Response.Writehead (200, {
'Content-longitud': Body.length,
'Content-type': 'Text/Plain'
});
Nota: La longitud de contenido se calcula en bytes, no en caracteres.
La razón del ejemplo anterior es que la cadena "¡Hola mundo!" Contiene solo caracteres de un solo byte.
Si el cuerpo contiene caracteres codificados por multibitos, Buffer.ByTelength () debe usarse para determinar el número de bytes de la cadena en el caso de la codificación de caracteres multibyte.
Debe explicarse más a fondo que el nodo no verifica si el atributo de contenido décimo coincide con la longitud del cuerpo transmitido.
Statuscode es un código de estado HTTP de tres bits, por ejemplo: "404". De lo que quiero hablar aquí es "http.status_codes", se incluyen todos los conjuntos y descripciones breves de los códigos de estado de respuesta estándar "HTTP".
La siguiente es la referencia del código fuente:
La copia del código es la siguiente:
var status_codes = exports.status_codes = {
100: 'Continuar',
101: 'Protocolos de conmutación',
102: 'Procesamiento', // RFC 2518, obsoletado por RFC 4918
200: 'Ok',
201: 'creado',
202: 'aceptado',
203: 'Información no autoritativa',
204: 'sin contenido',
205: 'Restablecer contenido',
206: 'Contenido parcial',
207: 'Multi-Status', // RFC 4918
300: 'Opciones múltiples',
301: 'movido permanentemente',
302: 'movido temporalmente',
303: 'ver otro',
304: 'no modificado',
305: 'usar proxy',
307: 'Redirección temporal',
400: 'mala solicitud',
401: 'no autorizado',
402: 'Pago requerido',
403: 'Prohibido',
404: 'no encontrado',
405: 'Método no permitido',
406: 'no aceptable',
407: 'Se requiere autenticación de poder',
408: 'Tiempo de espera de solicitud',
409: 'conflicto',
410: 'Gone',
411: 'Longitud requerida',
412: 'condición previa fallida',
413: 'Entidad de solicitud demasiado grande',
414: 'request-uri demasiado grande',
415: 'Tipo de medios no compatible',
416: 'Rango solicitado no satisfable',
417: 'expectativa fallida',
418: 'i/' ma tapot ', // rfc 2324
422: 'Entidad no procesable', // RFC 4918
423: 'Locked', // RFC 4918
424: 'Dependencia fallida', // RFC 4918
425: 'Colección desordenada', // RFC 4918
426: 'Actualización requerida', // RFC 2817
500: 'Error de servidor interno',
501: 'no implementado',
502 Puerta de enlace no válida',
503: 'Servicio no disponible',
504: 'Tiempo de tiempo de puerta de entrada',
505: 'Versión http no compatible',
506: 'La variante también negocia', // RFC 2295
507: 'Almacenamiento insuficial', // RFC 4918
509: 'Límite de ancho de banda excedido',
510: 'No extendido' // RFC 2774
};
Extraído del código fuente de NodeJS "http.js" comienza con la línea 143.
De hecho, no es difícil ver en el resultado de la respuesta del cliente:
(6 líneas): "Respuesta.End" ------ Cuando se envían todos los encabezados y mensajes de respuesta, este método envía la señal al servidor. El servidor pensará que el mensaje está completado.
Se debe llamar a este método después de que se complete cada respuesta. Si se especifica el parámetro "datos", es equivalente a llamar a "Respuesta.write (datos, codificación)" Primero y luego llamar "Respuesta.end ()".
(8 líneas): "Server.listen (8888)" ----- El servidor acepta conexiones con el mango especificado y se une a un puerto específico.
Lo anterior es un proceso de análisis más detallado, con la esperanza de ayudar a profundizar la comprensión. Aunque no hay mucho código, el enfoque está en comprender algunos mecanismos detallados para que las aplicaciones NodeJS puedan desarrollarse de manera eficiente en el futuro.
Tres, ejemplos
Además de usar el objeto "Solicitud" para acceder a los datos del encabezado de solicitud, el objeto "Solicitud" también se puede utilizar como un flujo de datos de solo lectura para acceder a los datos del cuerpo de la solicitud.
Aquí hay un ejemplo de una solicitud de "publicación":
La copia del código es la siguiente:
http.createServer (función (solicitud, respuesta) {
var cuerpo = [];
console.log (request.method);
console.log (request.headers);
request.on ('data', function (chunk) {
Body.push (fragmento);
});
request.on ('end', function () {
cuerpo = buffer.concat (cuerpo);
console.log (Body.ToString ());
});
}). Escuchar (8888);
A continuación se muestra un contenido completo de datos de solicitud de "HTTP".
La copia del código es la siguiente:
Post/http/1.1
Agente de usuario: curl/7.26.0
Anfitrión: localhost
Aceptar: */*
Contenido-longitud: 11
Tipo de contenido: aplicación/x-www-form-urlencoded
Hola Mundo
Cuatro, resumamos
(1) Comprender el concepto de "http".
(2) Competente en el uso de API relacionadas con "HTTP".
(3) Preste atención al control de los detalles, como: los detalles de procesamiento entre "POST, Get".
(4), Comprensión de "RequestListener".
(5), enfatice un concepto: un objeto de solicitud HTTP es un flujo legible, mientras que un objeto de respuesta HTTP es un flujo de escritura.