Разобравшись с get
запросом, пора переходить к post
и передаче данных на сервер. Для начала познакомимся с методом request
модуля http
. Ниже пример обычного GET запроса, который мы делали с помощью http.get
:
const options = {
hostname: 'ru.hexlet.io',
path: 'my',
method: 'GET', // default
}
const req = http.request(options, (res) => {
console.log(res.statusCode)
})
req.end()
На самом деле, http.get
– это обертка над http.request
, которая выполняет req.end
автоматически. Ее добавили в модуль http
только потому, что это очень частый вариант использования. Другими словами, http.request
— универсальный способ делать http запросы. Для выполнения любого запроса, нужно лишь правильно подставить глагол в опцию method
, будь то хоть POST, хоть HEAD.
Следующий аспект это заголовок Content-Length
. Как вы помните из курса http
, этот заголовок обязателен при наличии тела запроса. Он содержит цифру — количество байт в теле запроса. Так как данные формы обычно отправляют, используя тип application/x-www-form-urlencoded
, то перед подсчетом размера тела его нужно сначала сформировать, выполнив правильные преобразования.
// Content-Type: application/x-www-form-urlencoded
const postData = querystring.stringify({
msg: 'Hello World!',
key: 'value',
})
// msg=Hello%20World!&key=value
// Content-Length: ?
Buffer.byteLength(postData)
// 28
Рекомендуется всегда использовать такой способ определения размера тела запроса,
потому что он считает количество байт, в отличие от length
, который считает
количество символов в текстовом представлении. Различия будут проявляться при
использовании символов, не входящих в ASCII
.
'Пошло поехало'.length // 13
Buffer.byteLength('Пошло поехало') // 25
Теперь можно собрать все вместе и выполнить post
запрос с передачей данных формы:
const options = {
hostname: 'www.google.com',
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData),
},
}
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`)
})
req.write(postData)
req.end()
Данные отправляются с помощью метода write
объекта request
. Часто можно
упростить отправку до вызова req.end(postData)
. Метод write
больше полезен тогда,
когда используется отправка с помощью чанков, например, в случае передачи
больших бинарных данных (картинки, видео).