кодесурса
«node.js

Node.js: HTTP-сервер

script1adsense2code
script1adsense3code

Как создать 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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code