16. Документация к модулю http

В дальнейшем мы будем часто обращаться к модулю HTTP, поэтому сейчас не большая экскурсия по его документации, что в ней есть и где это искать.

screenshot_16_01

Сейчас модуль HTTP совмещает в себе два функционала. Первый функционал, это функционал сервера — http.createServer([requestListener]) создает новый объект класса http.Server. Если передан обработчик в http.createServer([requestListener]), то он ставится на Event: ‘request’. Второй функционал это http.createClient([port], [host]). Если мы найдем его в доке, мы увидим

screenshot_16_02

говорит используй http.request(). Его общий смысл такой, что он предназначен для создания http запросов. При помощи этого метода Node.JS может обратится к другому сайту или серверу. Сам по себе класс http.Server используется мало, создается объект, вешается обработчик на событие Event: ‘request’, запрос пришел, и при помощи server.listen(port[, hostname][, backlog][, callback]) серверу назначается определенный порт, хост или если у вас UNIX система, можно назначить UNIX socket — server.listen(path[, callback]). Далее при получении запроса происходит событие request и контроль приходит к функции обработчику — Event: ‘request’. Она получает два аргумента, первый request  — объект запроса, входящие данные. Второе response — объект ответа. Давайте начнем с объекта запроса. Но прежде обратите внимание в документации есть некоторые непонятки, возможно в будущем при переписовании модуля они будут устранены, Class: http.ClientRequest который здесь описан

screenshot_16_03

это вовсе не объект запроса о котором сейчас идет речь, Class: http.ClientRequest это объект запроса если мы используем «http.Client», если мы при помощи Node.JS генерируем этот запрос, а если мы это функционал не используем, то Class: http.ClientRequest в общем не причем.
Нас интересует Class: http.IncomingMessage

screenshot_16_04

Именно Class: http.IncomingMessage это первый параметр функции обработчика запроса и он получает message.url, message.method, message.headers и некоторые другие перечисленные в спецификации свойства. Хотелось бы обратить ваше внимание на то, что в спецификации  Class: http.IncomingMessage находятся не все свойства объекта запроса, потому что Class: http.IncomingMessage наследует другому классу Class: stream.Readable, который представляет собой так называемый поток и эти потоки мы в ближайшем будущем обсудим. По этому и события Event: ‘close и Event: ‘aborted не единственные, есть еще, мы перейдем к ним позже.

Обычный цикл работы сервера состоит из того, что мы узнаем, что именно к нам пришло

screenshot_16_04

читаем там url и другие свойства, а дальше отвечаем, осуществляя запись в объект Class: http.ServerResponse

screenshot_16_05

вот, второй параметр обработчика запросов «request». Если есть желание мы можем поставить свои заголовки, это делается либо вызовом response.writeHead(statusCode[, statusMessage][, headers]) который отправляет их в ответ тут же, либо неявным образом — response.setHeader(name, value), response.statusCode, неявный означает в данном случае, что тут же они отправлены не будут, а подождут первой записи. Впрочем во многих случаях никакие особые заголовки не требуются, можно сразу написать ответ, если это, скажем, веб страница, то ответ можно записать вызовом response.end([data][, encoding][, callback]) и в первом параметре указать текст страницы. Также для записи в ответ есть метод response.write(chunk[, encoding][, callback]), в отличии от response.end([data][, encoding][, callback]) он не закрывает соединение, поэтому response.write(chunk[, encoding][, callback]) используют в тех случаях когда мы хотим много, много раз что то писать в ответ постепенно, например потому что появляются все новые и новые данные, но и в этом случае для того чтобы окончить ответ используют response.end([data][, encoding][, callback]). Соединение будет висеть до того пока response.end([data][, encoding][, callback]) не будет вызван, ну либо пока его клиент не закроет или произойдет какая то ошибка. У объекта есть и другие свойства, события которые здесь не упомянуты потому что эта документация посвящена, собственно, Class: http.ServerResponse, а Class: http.ServerResponse является наследником другого класса который мы в дальнейшем тоже изучим, но на текущий момент мы уже знаем достаточно, чтобы получить запрос и отослать нормально ответ в браузер.