Node.js: HTTP-сервер
Как создать HTTP-сервер?
Протокол передачи гипертекста (HTTP) - это прикладной протокол для распределенных, совместных, гипермедиа информационных систем. HTTP является основой передачи данных для Всемирной паутины.
Веб-сервер - это компьютерная система, которая обрабатывает запросы через HTTP, основной сетевой протокол, используемый для распространения информации в сети Интернет. Термин может относиться как ко всей системе, так и конкретно к программному обеспечению, которое принимает и контролирует запросы HTTP. Чаще всего веб-серверы используются для размещения веб-сайтов, но есть и другие способы использования, такие как игры, хранение данных, запуск корпоративных приложений, обработка электронной почты, FTP или другое использование в Интернете.
Легко создать HTTP-сервер в Node.js. Узловой сервер обычно создается с использованием метода createServer модуля http. Смотрите следующий пример:
Пример :
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(200);
res.end('<h1>Learning Node.js http module!</h1>');
});
server.listen(8080);
Теперь сохраните приведенный выше код в файл с именем test_server.js и выполните следующую команду:
node test_server.js
После выполнения вышеупомянутой команды программа будет зависать там, она ожидает соединения, чтобы ответить. Чтобы ответить, откройте браузер и введите localhost: 8080 в адресную строку. Если все настроено правильно, вы должны увидеть на своем сервере надпись «Learning Node.js http module!».
Всякий раз, когда происходит запрос, вызывается обратный вызов функции (req, res), и строка записывается как ответ.
Следующая строка, server.listen (8080), вызывает метод listen, который заставляет сервер ожидать входящие запросы на указанный порт - 8080, в этом случае.
Особенности: http модуль
http.STATUS_CODES; | Коллекция всех стандартных кодов состояния ответа HTTP и краткое описание каждого из них. |
http.request (параметры, [обратный вызов]); | Эта функция позволяет прозрачно выдавать запросы. |
http.get ( options , [callback]); | Установите метод в GET и вызовите req.end () автоматически. |
server = http.createServer ([requestListener]); | Возвращает новый объект веб-сервера. RequestListener - это функция, которая автоматически добавляется в событие request. |
server.listen (порт, [имя хоста], [backlog], [обратный вызов]); | Начните принимать соединения на указанный порт и имя хоста. |
server.listen (путь, [обратный вызов]); | Запустите сервер сокетов UNIX, прослушивающий соединения по указанному пути. |
server.listen (дескриптор, [обратный вызов]); | В качестве объекта дескриптора можно указать либо сервер, либо сокет (что-либо с базовым элементом _handle), либо объект {fd: <n>}. |
server.close ([обратный вызов]); | Останавливает сервер от принятия новых подключений. |
server.setTimeout (msecs, callback); | Устанавливает значение времени ожидания для сокетов и генерирует событие 'timeout' для объекта Server, передавая сокет в качестве аргумента, если происходит тайм-аут. |
server.maxHeadersCount; | Ограничивает максимальное количество входящих заголовков, по умолчанию равное 1000. Если установлено значение 0 - ограничение не будет применяться. |
server.timeout; | Количество миллисекунд бездействия до истечения времени ожидания сокета. |
server.on ('запрос', функция (запрос, ответ) {}); | Издается каждый раз, когда есть запрос. |
server.on ('соединение', функция (сокет) {}); | Когда новый поток TCP установлен. |
server.on ('close', function () {}); | Выдается, когда сервер закрывается. |
server.on ('checkContinue', function (request, response) {}); | Испускается каждый раз, когда получен запрос с http Expect: 100-continue. |
server.on ('connect', function (request, socket, head) {}); | Выдается каждый раз, когда клиент запрашивает метод http CONNECT. |
server.on ('upgrade', function (request, socket, head) {}); | Выдается каждый раз, когда клиент запрашивает обновление http. |
server.on ('clientError', function (исключение, сокет) {}); | Если клиентское соединение генерирует событие «ошибка» - оно будет перенаправлено сюда. |
request.write (chunk, [encoding]); | Посылает кусок тела. |
request.end ([данные], [кодировка]); | Завершает отправку запроса. Если какие-либо части тела отсутствуют, это приведет их к потоку. |
request.abort (); | Отменяет запрос. |
request.setTimeout (timeout, [callback]); | Как только сокет назначен этому запросу и подключен, будет вызван socket.setTimeout (). |
request.setNoDelay ([NODELAY]); | Как только сокет назначен этому запросу и подключен, будет вызван socket.setNoDelay (). |
request.setSocketKeepAlive ([enable], [initialDelay]); | Как только сокет назначен этому запросу и подключен, будет вызван socket.setKeepAlive (). |
request.on ('response', function (response) {}); | Издается при получении ответа на этот запрос. Это событие генерируется только один раз. |
request.on ('socket', function (socket) {}); | Выдается после того, как сокету назначен этот запрос. |
request.on ('connect', function (response, socket, head) {}); | Испускается каждый раз, когда сервер отвечает на запрос методом CONNECT. Если это событие не прослушивается, клиенты, получающие метод CONNECT, закрывают свои соединения. |
request.on ('upgrade', function (response, socket, head) {}); | Отправляется каждый раз, когда сервер отвечает на запрос с обновлением. Если это событие не прослушивается, клиенты, получающие заголовок обновления, будут закрывать свои соединения. |
request.on ('continue', function () {}); | Выдается, когда сервер отправляет HTTP-ответ «100 Continue», обычно потому, что запрос содержал «Expect: 100-continue». Это инструкция, что клиент должен отправить тело запроса. |
response.write (chunk, [encoding]); | Это отправляет кусок тела ответа. Если этот метод вызывается, а response.writeHead () не вызывается, он переключается в неявный режим заголовка и очищает неявные заголовки. |
response.writeContinue (); | Отправляет клиенту сообщение HTTP / 1.1 100 Continue, указывающее, что тело запроса должно быть отправлено. |
response.writeHead (statusCode, [reasonPhrase], [заголовки]); | Отправляет заголовок ответа на запрос. |
response.setTimeout (msecs, callback); | Устанавливает значение времени ожидания Socket равным msecs. Если предусмотрен обратный вызов, он добавляется в качестве прослушивателя для события timeout объекта ответа. |
response.setHeader (имя, значение); | Устанавливает одно значение заголовка для неявных заголовков. Если этот заголовок уже существует в заголовках, подлежащих отправке, его значение будет заменено. Используйте массив строк здесь, если вам нужно отправить несколько заголовков с одинаковым именем. |
response.getHeader (имя); | Считывает заголовок, который уже был поставлен в очередь, но не отправлен клиенту. Обратите внимание, что имя не чувствительно к регистру. |
response.removeHeader (имя); | Удаляет заголовок, который стоит в очереди для неявной отправки. |
response.addTrailers (заголовки); | Этот метод добавляет в ответ конечные заголовки HTTP (заголовок, но в конце сообщения). |
response.end ([данные], [кодировка]); | Этот метод сообщает серверу, что все заголовки и тело ответа отправлены; этот сервер должен считать это сообщение завершенным. Метод response.end () ДОЛЖЕН вызываться для каждого ответа. |
response.statusCode; | При использовании неявных заголовков (без явного вызова response.writeHead ()) это свойство контролирует код состояния, который будет отправлен клиенту при сбросе заголовков. |
response.headersSent; | Boolean (только для чтения). True, если заголовки были отправлены, иначе false. |
response.sendDate; | При значении true заголовок Date будет автоматически создан и отправлен в ответе, если его еще нет в заголовках. По умолчанию true. |
response.on ('close', function () {}); | Указывает, что основное соединение было прервано до того, как response.end () был вызван или смог сбросить. |
response.on ('finish', function () {}); | Издается, когда ответ отправлен. |
message.httpVersion; | В случае запроса сервера, версия HTTP отправляется клиентом. В случае ответа клиента - HTTP-версия подключенного сервера. |
message.headers; | Объект заголовков запроса / ответа. |
message.trailers; | Объект трейлеры запрос / ответ. Заполняется только после окончания события. |
message.method; | Метод запроса в виде строки. Только для чтения Пример: «GET», «DELETE». |
message.url; | Запросить строку URL. Он содержит только URL-адрес, который присутствует в фактическом HTTP-запросе. |
message.statusCode; | Трехзначный код состояния ответа HTTP. EG 404. |
message.socket; | Объект net.Socket, связанный с соединением. |
Опции
хозяин | Доменное имя или IP-адрес сервера, на который нужно отправить запрос. По умолчанию «localhost». |
имя хоста | Для поддержки url.parse () имя хоста предпочтительнее хоста |
порт | Порт удаленного сервера. По умолчанию 80. |
localAddress | Локальный интерфейс для привязки для сетевых подключений. |
socketPath | Unix Domain Socket (используйте один из хостов: port или socketPath) |
метод | Строка, определяющая метод HTTP-запроса. По умолчанию «GET». |
дорожка | Запросить путь. По умолчанию «/». Должен включать строку запроса, если есть. EG '/index.html?page=12' |
заголовки | Объект, содержащий заголовки запроса. |
авт | Обычная аутентификация, т. Е. «Пользователь: пароль» для вычисления заголовка авторизации. |
агент | Управляет поведением агента. При использовании агента запрос по умолчанию будет Connection: keep-alive. Возможные значения: undefined (по умолчанию): использовать глобальный агент для этого хоста и порта. Объект агента: явно использовать переданный агент. false: отказывается от пула соединений с Агентом, по умолчанию запрос на Соединение: закрыть. |
Пример :
Node.js Создать HTML
В следующем примере отображается текст с тегами h1 и абзаца.
var http = require('http');
http.createServer(function (req, res) {
var html = buildHtml(req);
res.writeHead(200, {
'Content-Type': 'text/html',
'Content-Length': html.length,
'Expires': new Date().toUTCString()
});
res.end(html);
}).listen(8080);
function buildHtml(req) {
var header = '';
var body ='<h1>Node.js Tutorial</h1><p>We are learning http module</>';
return '<!DOCTYPE html>'
+ '<html><header>' + header + '</header><body>' + body + '</body></html>';
};
Получите доступ к указанному выше HTML с помощью http: // localhost: 8080 из вашего браузера.
Как сделать http запрос?
Для сетевого приложения крайне распространено программирование для выполнения внешних HTTP-вызовов. Node.js предоставляет простой API для этой функциональности в виде http.request. В следующем примере мы делаем запрос GET в /php/function-reference/srand-example.php (который возвращает случайное целое число) и выводим результат на консоль.
Пример:
var http = require('http');
//Complete url to get the random numbers :
'/php/function-reference/srand-example.php'
var options = {
host: 'kodesource.top',
path: '/php/function-reference/srand-example.php'
};
callback = function(response) {
var str = '';
// chunk of data has been recieved and append it to `str`
response.on('data', function (chunk) {
str += chunk;
});
//the whole response has been recieved, now print it out here
response.on('end', function () {
console.log(str);
});
}
http.request(options, callback).end();
Выход:
E: / nodejs> узел test.js 1308772920 E: / nodejs> узел test.js 1458134273 E: / nodejs> узел test.js 1153445869 E: / nodejs> узел test.js 1628318176 E: / nodejs> узел test.js 1323706499
Исходный код (srand-example.php):
Функция srand () запускает генератор случайных чисел.
<?php
srand(mktime());
echo rand();
?>
Код для выполнения запроса POST практически идентичен запросу GET, всего несколько простых модификаций. Мы сделаем POST-запрос к kodesource.top с путем '/html/ul/html-ul-tag-example.html' и с помощью консоли соберем код упоминания файла относительно пути.
Пример:
var http = require('http');
var options = {
host: 'kodesource.top',
path: '/html/ul/html-ul-tag-example.html',
method: 'POST'
};
callback = function(response) {
var str = ''
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
console.log(str);
});
}
var req = http.request(options, callback);
//This is the data we are posting, it needs to be a string or a buffer
req.write("");
req.end();
Выход:
E: / nodejs> узел test.js <! DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 // EN" "http://www.w3.org/TR/html4/strict.dtd"> <HTML> <Голова> <meta http-equ = "Content-Type" content = "text / html; charset = iso-8859-1"> <title> Пример HTML-тега ul </ title> </ HEAD> <Тело> <UL> <Li> Учебные пособия </ li> <li> Редактор онлайн-практики </ li> <Li> Примеры </ литий> <Li> Ссылки </ li> <Li> Видео </ li> </ UL> </ Body> </ Html>
Читать данные POST
Чтение данных из запроса POST (например, отправка формы) в Node.js. не представляет особых сложностей. Первым шагом является прослушивание входящих данных, а затем ожидание завершения данных, чтобы вы могли обработать все данные формы, не теряя ничего. Вот пример:
Пример:
var http = require('http');
var uhtml =
'<html><head><title>Post Example</title></head>' +
'<body>' +
'<p>Input your name and Address</p>'+
'<form method="post">' +
'Name : <input name="name" size=20><br>' +
'Address : <input name="address" size=50><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer(function (req, res) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
console.log('POSTed: ' + body);
res.writeHead(200);
res.end(uhtml);
});
}).listen(8080);
В приведенном выше примере переменная 'uhtml' является статической строкой, содержащей HTML-код для одной текстовой строки, двух полей ввода и поля отправки. Этот HTML-код предоставлен для того, чтобы вы могли размещать некоторые данные. Мы создали сервер для прослушивания запроса. Как только все данные получены, мы регистрируем данные на консоли и отправляем ответ.
Выход :
E: / nodejs> узел test.js Оставлено: Отправлено: имя = Ренука и адрес = Нью-Дели Оставлено:
В приведенном выше выводе есть несколько строк без данных, например, POSTed:. Это происходит потому, что обычные запросы GET проходят через один и тот же код.
http.get (options, [callback])
Поскольку большинство запросов являются запросами GET без тел, Node предоставляет этот удобный метод. Здесь http.request () устанавливает метод в GET и автоматически вызывает req.end (). Вот пример:
Пример:
var http = require('http');
http.get("http://www.duckduckgo.com", function(res) {
console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
var http = require('http');
Примечание: res.statuscode отправляет код состояния ответа (например, 404) клиенту, когда заголовки очищаются.
Выход:
E: / nodejs> узел test.js Получил ответ: 301
Предыдущая: Глобальный объект
Далее: Util Module
Новый контент: Composer: менеджер зависимостей для PHP , R программирования