#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. Я не уверен. Какие ошибки вы получили после изменения строки запроса, но до изменения типа содержимого?