Базовая библиотека https против библиотеки запросов npm

#node.js #https #request

#node.js #https #запрос

Вопрос:

Я столкнулся с очень странной проблемой при попытке использовать встроенную библиотеку 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.
Referenceamp;#32;amp;#35;7amp;#46;24507368amp;#46;1554749705amp;#46;3185b29b
  

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

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

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

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

Ответ №1:

При использовании собственных модулей 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
    },
  };

  

«запрос» построен поверх собственных модулей и выполняет это внутренне, когда вы передаете ему тело json

Комментарии:

1. Спасибо! На самом деле я делал это раньше в предыдущих реализациях, но забыл прочитать свои собственные заметки. Можете ли вы объяснить, зачем ему нужна строка запроса против JSON.stringify?

2. к сожалению, это не помогло. Даже при этом у меня все еще возникают проблемы с сервером, с которого я запрашиваю

3. Мне пришлось использовать этот тип содержимого в заголовке, чтобы заставить его работать, вы знаете, почему: ‘application / x-www-form-urlencoded’,

4. Я не уверен. Какие ошибки вы получили после изменения строки запроса, но до изменения типа содержимого?