Как сделать HTTP / 2 запрос с полезной нагрузкой тела? - PullRequest
0 голосов
/ 27 августа 2018

Я хочу открыть поток HTTP / 2 и использовать этот поток для выполнения нескольких запросов HTTP / 2 POST.Каждый запрос POST будет иметь свою собственную полезную нагрузку тела.

В настоящее время у меня есть код ниже, который работает для запросов, которые не требуют полезной нагрузки, но я не уверен, как настроить его для запросов, которые требуютполезная нагрузка.

Я прочитал RFC 7540 и почти все связанные посты на SO, но мне все еще трудно писать рабочий код HTTP / 2 , используя тело полезной нагрузки .

Например:

  • Использует stream.write рекомендуемый способ отправки кадров DATA, или мне следует использовать встроенную функцию, предоставляемую http2?
  • Я передаю аргументы в виде открытого текста, а протокол http2 заботится о двоичном кодировании, или я сам его кодирую?
  • Как мне изменить приведенный ниже код для отправки тела полезной нагрузки?

.

const http2 = require('http2')
const connection = http2.connect('https://www.example.com:443')

const stream = connection.request({
  ':authority':'www.example.com',
  ':scheme':'https',
  ':method': 'POST',
  ':path': '/custom/path',
}, { endStream: false })

stream.setEncoding('utf8')

stream.on('response', (headers) => {
  console.log('RESPONSE', headers)
  stream.on('data', (data) => console.log('DATA', data))
  stream.on('end', () => console.log('END'))
})

stream.write(Buffer.from('POST-request-payload-body-here?'))

1 Ответ

0 голосов
/ 04 апреля 2019
  • Первое, что вам нужно сделать, это преобразовать данные тела в буфер.

    var buffer = new Buffer(JSON.stringify(body));

  • . Вам нужно обновить объект connection.request с помощьюКлючи Content-Type и Content-Length.Обратите внимание, что Content-Length - это длина буфера
   const stream = connection.request({
             ':authority':'www.example.com',
             ':scheme':'https',
             ':method': 'POST',
             ':path': '/custom/path',
             'Content-Type': 'application/json',
             'Content-Length': buffer.length
   }, { endStream: false })

  • Наконец, вам нужно отправить запрос путем преобразования данных тела в строку

   stream.end(JSON.stringify(body));

...