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