Поместить вложенные объекты в строку запроса - Node.js

Мой код пытается отправить данные в Coldfusion API с моего локального сервера Node.js. Мне удалось связаться с API и пройти аутентификацию через заголовки запросов. Однако у меня возникают трудности с передачей моего объекта JSON, поскольку я не могу правильно получить структуру.

API не принимает параметр JSON модуля запроса, поэтому это самый простой вариант из окна.

API ожидает следующее:

{ 
    'source': { 
        'customer': {
            'customerlogin': 'myusername',
            'customerpassword': 'mypassword',
         }
     }
}

мой код работает, если я жестко закодирую следующий параметр body (от успешного сообщения кем-то еще) в свой пост.

var Jrequest = require('request');

var options = {
  uri: 'http://myAPI/customerSSO.json',
  headers: {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': something', 'Timestamp': timestamp},
  method: 'POST',
  body: 'source=%7B%0D%0A++%22customer%22%3A+%7B%0D%0A++++%22customerlogin%22%3A+%22myusername%22%2C%0D%0A++++%22customerpassword%22%3A+%22mypassword%22%2C%0D%0A%09%22success%22%3A+%22%22%0D%0A++%7D%0D%0A%7D' // Working
};


Jrequest(options, function (error, response, body){
    res.send(body);
});

Если я отправляю JSON другими способами, например json.stringify(), он отклоняется на том основании, что "источник необходим, но не определен".

Итак, я полагаю, что мой вопрос: в Node.js как превратить JSON во что-то похожее на это

'source=%7B%0D%0A++%22customer%22%3A+%7B%0D%0A++++%22customerlogin%22%3A+%22myusername%22%2C%0D%0A++++%22customerpassword%22%3A+%22mypassword%22%2C%0D%0A%09%22success%22%3A+%22%22%0D%0A++%7D%0D%0A%7D'

или я пропустил еще один вариант?

Спасибо за любую помощь и извинения, если я использовал неправильную терминологию.

Ответ 1

Я думаю, что это должно сработать:

var querystring = require('querystring');
...
request({
  ...
  headers : { 'Content-Type': 'application/x-www-form-urlencoded', ... },
  body    : 'source=' + querystring.escape(JSON.stringify({
    'customer': {
      'customerlogin': 'myusername',
      'customerpassword': 'mypassword',
    }
  })),
  ...
}, ...)

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