HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Предположим, что мы хотим программно выполнить get запрос к Хекслету. В nodejs сделать это довольно просто:</p>
1 <p>Предположим, что мы хотим программно выполнить get запрос к Хекслету. В nodejs сделать это довольно просто:</p>
2 <p>Вторым параметром передается колбек, который будет вызван после получения ответа. Он также принимает на вход объект response, который содержит в себе параметры ответа.</p>
2 <p>Вторым параметром передается колбек, который будет вызван после получения ответа. Он также принимает на вход объект response, который содержит в себе параметры ответа.</p>
3 <p>Этих параметров внутри response очень много, и только некоторые из них наиболее часто используются или могут быть нам интересны. В первую очередь это следующий набор:</p>
3 <p>Этих параметров внутри response очень много, и только некоторые из них наиболее часто используются или могут быть нам интересны. В первую очередь это следующий набор:</p>
4 <p>Также get позволяет передавать первым параметром не адрес, а набор опций, из которого будет составлен адрес. Такое бывает полезно, когда у нас нет готового адреса, но есть его части:</p>
4 <p>Также get позволяет передавать первым параметром не адрес, а набор опций, из которого будет составлен адрес. Такое бывает полезно, когда у нас нет готового адреса, но есть его части:</p>
5 <p>Обо всех доступных опциях можно прочитать в официальной документации, а из самых распространенных мы выделим следующие:</p>
5 <p>Обо всех доступных опциях можно прочитать в официальной документации, а из самых распространенных мы выделим следующие:</p>
6 <ul><li>headers - объект, в котором ключ - это название заголовка</li>
6 <ul><li>headers - объект, в котором ключ - это название заголовка</li>
7 <li>method - например, GET</li>
7 <li>method - например, GET</li>
8 <li>port</li>
8 <li>port</li>
9 <li>hostname</li>
9 <li>hostname</li>
10 <li>path</li>
10 <li>path</li>
11 </ul><h2>Body</h2>
11 </ul><h2>Body</h2>
12 <p>В запросе выше не хватает одной важной детали: получение тела ответа. Тут нас поджидает небольшой сюрприз. Объект response не содержит внутри себя тело ответа. Связано это с тем, что ответ может приходить чанками, и response дает возможность получать эти чанки сразу и независимо друг от друга. С одной стороны, это более гибкая возможность, которая позволяет работать с большим телом, без того чтобы занимать много оперативной памяти; с другой стороны, для простых запросов приходится доставать тело немного более сложным способом, чем хотелось бы. Но, в конечном итоге, все сводится к понятному коду, который нужно просто запомнить.</p>
12 <p>В запросе выше не хватает одной важной детали: получение тела ответа. Тут нас поджидает небольшой сюрприз. Объект response не содержит внутри себя тело ответа. Связано это с тем, что ответ может приходить чанками, и response дает возможность получать эти чанки сразу и независимо друг от друга. С одной стороны, это более гибкая возможность, которая позволяет работать с большим телом, без того чтобы занимать много оперативной памяти; с другой стороны, для простых запросов приходится доставать тело немного более сложным способом, чем хотелось бы. Но, в конечном итоге, все сводится к понятному коду, который нужно просто запомнить.</p>
13 <p>Как видно из примера выше, объект response представляет из себя eventEmitter с событиями data и end. Первое вызывается после получения очередного чанка с данными, второе вызывается после того, как все данные пришли и нужно обозначить конец обработки.</p>
13 <p>Как видно из примера выше, объект response представляет из себя eventEmitter с событиями data и end. Первое вызывается после получения очередного чанка с данными, второе вызывается после того, как все данные пришли и нужно обозначить конец обработки.</p>
14 <h2>Buffer</h2>
14 <h2>Buffer</h2>
15 <p>Из кода сбора чанков в body можно сделать вывод, что chunk - это не строка. Это действительно так, chunk - это объект типа Buffer, который предназначен для хранения потока байтов в виде массива фиксированного размера. Нужно это по той простой причине, что данные, передаваемые по http, не обязательно имеют текстовое представление. Возможна передача также и бинарных данных, таких как картинки, архивы и тому подобное.</p>
15 <p>Из кода сбора чанков в body можно сделать вывод, что chunk - это не строка. Это действительно так, chunk - это объект типа Buffer, который предназначен для хранения потока байтов в виде массива фиксированного размера. Нужно это по той простой причине, что данные, передаваемые по http, не обязательно имеют текстовое представление. Возможна передача также и бинарных данных, таких как картинки, архивы и тому подобное.</p>
16 <h2>Errors</h2>
16 <h2>Errors</h2>
17 <p>Во время выполнения запроса может произойти все, что угодно. Библиотека http обрабатывает эти ошибки и кидает соответствующие исключения. К таким ошибкам относятся например:</p>
17 <p>Во время выполнения запроса может произойти все, что угодно. Библиотека http обрабатывает эти ошибки и кидает соответствующие исключения. К таким ошибкам относятся например:</p>
18 <ul><li>Проблемы с DNS</li>
18 <ul><li>Проблемы с DNS</li>
19 <li>Ошибки уровня tcp</li>
19 <li>Ошибки уровня tcp</li>
20 <li>Ошибки парсинга http ответа</li>
20 <li>Ошибки парсинга http ответа</li>
21 </ul><p>Если для программы важно не завершаться в случае таких ошибок, то можно ловить событие error на объекте request, который возвращается после выполнения get запроса и производить желаемое действие:</p>
21 </ul><p>Если для программы важно не завершаться в случае таких ошибок, то можно ловить событие error на объекте request, который возвращается после выполнения get запроса и производить желаемое действие:</p>
22  
22