1. Вступительный анализ
Прежде всего, каждый должен быть знаком с концепцией «http». Он не основан на конкретном языке, но является общим протоколом уровня приложений. У разных языков есть разные детали реализации, но они соответствуют своим принципам, а идеи одинаковы.
Как управляемая среда хоста, Nodejs использует JavaScript в качестве языка хоста, а также имеет свой собственный набор стандартов. В этой статье давайте вместе узнаем о «модуле HTTP». Но как предпосылка,
Я надеюсь, что вы сможете сначала прочитать API, предоставленный официальным веб -сайтом, и иметь предварительное понимание, которое сделает его намного более удобным. Ниже приведен обзор API в HTTP -части:
Кода -копия выглядит следующим образом:
Http
http.status_codes
http.createserver ([requestListener])
http.createclient ([port], [host])
Класс: http.server
Событие: 'Запрос'
Событие: 'Connection'
Событие: «Закрыть»
Событие: 'CheckContinue'
Событие: 'подключить'
Событие: «Обновление»
Событие: 'ClientError'
server.listen (port, [hostname], [backlog], [обратный вызов])
server.listen (path, [обратный вызов])
server.listen (handle, [обратный вызов])
server.close ([обратный вызов])
server.maxheaderscount
server.settimeout (msecs, обратный вызов)
server.timeout
Класс: http.serverresponse
Событие: «Закрыть»
response.writecontinue ()
response.writehead (StatusCode, [Dasephrase], [заголовки])
response.settimeout (msecs, обратный вызов)
response.statuscode
response.setheader (имя, значение)
Ответ
response.senddate
response.getheader (имя)
response.removeheader (имя)
response.write (Chunk, [кодирование])
response.addtrailers (заголовки)
response.end ([data], [кодирование])
http.request (Options, обратный вызов)
http.get (options, обратный вызов)
Класс: http.agent
новый агент ([опции])
Agent.maxsockets
Agent.maxFreesockets
Агент.sockets
Agent.freesockets
Agent.Requests
Agent.destroy ()
Agent.getName (Options)
http.globalagent
Класс: http.clientrequest
Событие 'ответ'
Событие: «Сокет»
Событие: 'подключить'
Событие: «Обновление»
Событие: «Продолжить»
request.write (chunk, [кодирование])
request.end ([data], [кодирование])
request.abort ()
request.settimeout (timeout, [обратный вызов])
request.setnodelay ([nodelay])
request.setsocketkeepalive ([inable], [initialledelay])
http.incommingmessage
Событие: «Закрыть»
Message.httpversion
Сообщение.Headers
Message.RawHeaders
Сообщение.trailers
Message.RawTrailers
message.settimeout (msecs, обратный вызов)
Message.method
Сообщение.url
Message.statuscode
Сообщение.socket
Давайте начнем с простого примера, создайте файл с названием Server.js и напишите следующий код:
Кода -копия выглядит следующим образом:
var http = require ('http');
var server = http.createserver (function (req, res) {
res.writeheader (200, {
'' Content-Type ':' Text/plain; charset = utf-8 '// add charset = utf-8
});
res.end ("Привет, большой медведь!");
});
Server.Listen (8888);
console.log ("http -сервер, работающий на порту 8888 ...");
(Node Server.js) Ниже приведен результат выполнения:
2. Подробный примеры анализа
Давайте посмотрим на этот маленький пример:
(Строка 1): введите модуль «HTTP», который поставляется с Nodejs через «Tress» и назначьте его с переменной HTTP.
(2 строки): вызовите функцию, предоставленную модулем HTTP: «CreateServer». Эта функция возвращает новый объект веб -сервера.
Параметр «requestListener» - это функция, которая будет автоматически добавлена в очередь прослушивания события «запроса».
Когда придет запрос, емкость для событий поместит функцию обратного вызова прослушивателя в очередь выполнения, и весь код в узле выполняется один за другим из очереди выполнения.
Все эти выполнения находятся в потоке работников (сам цикл событий может рассматриваться как в независимом потоке. Мы, как правило, не упоминаем этот поток, но вызовут узел узел с одним нагрузкой среды выполнения).
Все обратные вызовы запускаются в рабочей ветке.
Давайте посмотрим на функцию обратного вызова «requestListener», которая предоставляет два параметра (запрос, ответ).
Запускается каждый раз, когда получен запрос. Обратите внимание, что каждое соединение может иметь несколько запросов (в подключениях к Alive).
«Запрос» - это экземпляр http.incommingMessage. «Ответ» является экземпляром HTTP.ServerResponse.
Объект HTTP -запроса - это читаемый поток, в то время как объект ответа HTTP является записью для записи.
Объект «outmentmessage» создается Http.server или http.clientrequest.
И передать в качестве первого параметра событиям «запрос» и «ответа» соответственно.
Его также можно использовать для доступа к состоянию, файлам заголовков и данных ответа.
Он реализует интерфейс «потока», а также следующие дополнительные события, методы и свойства. (См. Подробнее).
(3 строки): «Написать», используйте функцию «response.writehead ()», чтобы отправить HTTP Status 200 и тип контента HTTP-заголовка (тип контента).
Ответьте на заголовок запроса. «StatusCode»-это трехбитный код состояния HTTP, такой как 404. Последний параметр, «заголовки»,-это содержание заголовка ответа.
Возьмите каштан:
Кода -копия выглядит следующим образом:
var body = 'hello world';
response.writehead (200, {
«Содержание»: Body.Length,
'Content-Type': 'Текст/простой'
});
ПРИМЕЧАНИЕ. Длина содержимого рассчитывается в байтах, а не в символах.
Причина предыдущего примера заключается в том, что строка «Привет, мир!» Содержит только одно-байтовые символы.
Если корпус содержит мультибит-кодируемые символы, Buffer.bytelength () следует использовать для определения количества байтов строки в случае кодирования мультибитного символа.
Следует дополнительно объяснить, что узел не проверяет, соответствует ли атрибут содержимого с полом содержания по длине передаваемой тела.
Статус-код-это трехбитный код состояния HTTP, например: «404». Здесь я хочу поговорить, так это «http.status_codes», включены все наборы и краткие описания стандартных кодов состояния ответа «http».
Ниже приведен ссылка на исходный код:
Кода -копия выглядит следующим образом:
var status_codes = exports.status_codes = {
100: «Продолжить»,
101: «Протоколы переключения»,
102: «Обработка», // RFC 2518, устарел RFC 4918
200: «ОК»,
201: «Создано»,
202: «Принято»,
203: «Неавторитационная информация»,
204: «нет контента»,
205: «Сбросить контент»,
206: «частичный контент»,
207: «Multi-Status», // RFC 4918
300: «Несколько вариантов»,
301: «Переехал навсегда»,
302: «временно перемещен»,
303: «Смотрите другие»,
304: «Не изменен»,
305: «Использовать прокси»,
307: «Временный перенаправление»,
400: «Плохая просьба»,
401: «Несанкционированный»,
402: «Требуется оплата»,
403: «Запрещено»,
404: «Не найдено»,
405: «Метод не разрешен»,
406: «Не приемлемо»,
407: «Требуется аутентификация по доверенности»,
408: «Запросить тайм-аут»,
409: «Конфликт»,
410: «Ушли»,
411: «Требуется длина»,
412: «ПРЕДОСТАВЛЕНИЕ НЕПРАВИЛЬНО»,
413: «Запросить сущность слишком большой»,
414: «Запрос-ури слишком большой»,
415: «Неподдерживаемый тип медиа»,
416: «Запрашиваемый диапазон не удовлетворяет»,
417: «Ожидание не удалось»,
418: 'i/' Ma Teapot ', // RFC 2324
422: «Необработанная сущность», // RFC 4918
423: «Заблокирован», // RFC 4918
424: «Неудачная зависимость», // RFC 4918
425: «Неупорядоченная коллекция», // RFC 4918
426: «Требуется обновление», // RFC 2817
500: «Ошибка внутреннего сервера»,
501: «не реализован»,
502 Неверный шлюз',
503: «Сервис недоступен»,
504: 'Time-Out',
505: «http -версия не поддерживается»,
506: «Вариант также переговоры», // RFC 2295
507: «Несофальное хранение», // RFC 4918
509: «Предел полосы пропускания превышен»,
510: «Не расширен» // RFC 2774
};
Выдержка из исходного кода Nodejs "http.js" начинается с строки 143.
На самом деле, из результата ответа клиента не сложно увидеть:
(6 строк): «response.end» ------ Когда все заголовки ответов и сообщения отправляются, этот метод отправляет сигнал на сервер. Сервер будет думать, что сообщение завершено.
Этот метод должен быть вызван после завершения каждого ответа. Если указан параметр «Данные», он эквивалентен вызову «response.write (data, кодирование)» сначала, а затем вызов «response.end ()».
(8 строк): «server.listen (8888)» ----- Сервер принимает подключения с указанной ручкой и связывает с определенным портом.
Выше приведено более подробный процесс анализа, надеясь помочь углубить понимание. Хотя кода не так много, основное внимание уделяется пониманию некоторых подробных механизмов, чтобы приложения Nodejs могли быть эффективно разработаны в будущем.
Три, примеры
В дополнение к использованию объекта «запроса» для доступа к данным заголовка запроса, объект «запроса» также может использоваться в качестве потока данных только для чтения для доступа к данным корпуса запроса.
Вот пример запроса «сообщения»:
Кода -копия выглядит следующим образом:
http.createserver (function (запрос, ответ) {
var body = [];
console.log (request.method);
console.log (request.headers);
request.on ('data', function (chunk) {
Body.push (кусок);
});
request.on ('end', function () {
Body = buffer.concat (тело);
console.log (body.toString ());
});
}). Слушайте (8888);
Ниже приведено полное содержание данных «HTTP» запроса.
Кода -копия выглядит следующим образом:
Post/http/1.1
Пользовательский агент: Curl/7.26.0
Ведущий: Localhost
Принимать: */*
Длина контента: 11
Тип контента: приложение/x-www-form-urlencoded
Привет, мир
Четыре, давайте обобфрим
(1) Понять концепцию «http».
(2) Опытный в использовании «HTTP», связанные с API.
(3) Обратите внимание на контроль деталей, такие как: детали обработки между «post, get».
(4), Понимание "requestListener".
(5), подчеркните концепцию: объект HTTP -запроса - это читаемый поток, в то время как объект ответа HTTP - это поток для записи.