Базовая библиотека https против библиотеки npm 'request' - PullRequest
0 голосов
/ 09 апреля 2019

Я сталкиваюсь с очень странной проблемой при попытке использовать библиотеку https встроенного узла.

Заголовки запроса:

  let requestDetails = {
    hostname: 'api.domain.com',
    method: 'POST',
    path: '/endpointIWant/goHere
    headers: {
      'Client-ID': clientId,
      'Content-Type': 'application/json',
      Authorization: bearerToken
    },
  };

Тело запроса:

 let body = JSON.stringify({
    "content_type": "application/json",
     "message" : message
  });

Это мой стандартный вызов с использованием библиотеки https узла по умолчанию:

 let req = https.request(requestDetails, function (res){

    let responseBody = undefined;

    res.on('body', function(res) {
      responseBody = '';
    });

    res.on('data', function(chunk) {
      responseBody += chunk;
    });

    res.on('end', function() {
      console.log(responseBody);
    });
  });

  req.write(body);

  req.on('error', function(e) {
    console.log(e);
  });

  req.end();

Теперь, когда я отправляю этот запрос соответствующему серверу, я получаю:

Your browser sent a request that this server could not understand.
Reference #7.24507368.1554749705.3185b29b

Однако, когдаЯ использую популярную библиотеку 'request' в NPM, она работает нормально, и я получаю ожидаемый ответ.

Это наводит на мысль, что есть нечто иное в «кодировании» или «чанкинге» запросов междуэти две библиотеки, но я не могу понять, что.

Кто-нибудь имеет опыт работы с библиотекой https узла и понимает, есть ли здесь какие-то ошибки?

Я предпочитаю максимально использовать встроенные библиотекичтобы размер моего пакета был низким.

1 Ответ

1 голос
/ 09 апреля 2019

При использовании собственных http или https модулей вам нужно использовать модуль querystring, чтобы привести в порядок свое тело.

const querystring = require('querystring');

let body = querystring.stringify({
    "content_type": "application/json",
    "message" : message
});

//also include the content length of your body as a header

let requestDetails = {
    hostname: 'api.domain.com',
    method: 'POST',
    path: '/endpointIWant/goHere
    headers: {
      'Client-ID': clientId,
      'Content-Type': 'application/json',
      'Content-Length' : body.length
      Authorization: bearerToken
    },
  };

'request' построен поверх собственных модулей и делает это внутренне, когда вы передаете ему тело json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...