Разобравшись с 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 больше полезен тогда,
когда используется отправка с помощью чанков, например, в случае передачи
больших бинарных данных (картинки, видео).