nodejs не может выполнить http post с заголовком авторизации

#node.js #rest

#node.js #rest

Вопрос:

это запрос, который я хочу выполнить:

 POST /v1/oauth2/token HTTP/1.1
Host: api.sandbox.paypal.com
Accept: application/json
Accept-Language: en_US
Authorization: Basic cGF5cGFsaWQ6c2VjcmV0
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
  

Я попробовал это в nodejs, используя этот код:

 paypalSignIn = function(){
var username = process.env.PAYPALID;
var password = process.env.PAYPALSECRET;
var auth = 'Basic '   Buffer.from(username   ':'   password).toString('base64');
// new Buffer() is deprecated from v6

// auth is: 'Basic VGVzdDoxMjM='
 var post_data = querystring.stringify({
      'grant_type' : 'client_credentials',
  });
var header = {'Accept': 'application/json', 'Authorization': auth, 'Accept-Language': 'en_US'};
const options = {
  hostname: 'api.sandbox.paypal.com',
  port: 443,
  path: '/v1/oauth2/token',
  method: 'POST',
  headers: header,
}

var post_req = http.request(options, function(res) {
      res.setEncoding('utf8');
        res.on('data', function (chunk) {
      console.log('Response: '   chunk);
  });
});
 post_req.write(post_data);
 post_req.end();
  

}

К сожалению, я получаю следующую ошибку:

Ошибка: зависание сокета

Ответ №1:

Попробуйте использовать https модуль (недостаточно установить порт 443, вы должны использовать протокол HTTPS для подключения к конечной точке HTTPS).

Я также заметил, что вы не установили Content-Type заголовок. Это зависит от API, но это может вызвать проблемы и у вас.

Наконец, я бы подумал об использовании библиотеки, которая обертывает http / https например, node-fetch, bent или axios для этого, а не напрямую стандартной библиотеки. Он может обрабатывать такие вещи, как запись в сокет, установка Content-Length заголовка и т.д.