2016-08-09 2 views
0

Я пытаюсь отправить запрос POST от моего контроллера angularjs к серверу nodejs, который затем должен отправить полный запрос POST внешнему API и таким образом избежать запроса CORS, а также сделать его более безопасным поскольку я отправляю относительно частные данные в этот запрос POST.Nodejs, отправляющий внешний API POST-запрос

Моего angularjs функция контроллер для выполнения запроса на запись к nodejs сервера выглядит следующим образом, и это работает прекрасно:

var noteData = { 
    "id":accountNumber, 
    "notes":[ 
     { 
      "lId":707414, 
      "oId":1369944, 
      "nId":4154191, 
      "price":23.84 
     } 
    ] 
} 

var req = { 
    method: 'POST', 
    url: '/note', 
    data: noteData 
} 

$http(req).then(function(data){ 
    console.log(data); 
}); 

Теперь проблема заключается в моем сервере nodejs, где я просто не могу показаться, чтобы выяснить как правильно отправить запрос POST с пользовательскими заголовками и передать переменную данных JSON.

У меня есть trierd с помощью функции nodejs https, так как URL-адрес, который мне нужен, является https, а не http, у меня также есть попробовал функцию запроса без везения.

Я знаю, что URL-адрес и данные, которые я отправляю, являются правильными, поскольку, когда я подключаю их к Postman, он возвращает то, что я ожидаю, что оно вернется. Вот мои различные попытки на nodejs сервере:

Данные из angularjs запроса анализируется и извлекается правильно используя тело-анализатор

Попытка с помощью запроса:

app.post('/buyNote', function (req, res) { 
var options = { 
    url: 'https://api.lendingclub.com/api/investor/v1/accounts/' + accountNumber + '/trades/buy/', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json', 
     'Authorization': apiKey 
    }, 
    data = JSON.stringify(req.body); 
}; 


request(options, function (error, response, body) { 
    if (!error) { 
     // Print out the response body 
     // console.log(body) 
     console.log(response.statusCode); 
     res.sendStatus(200); 
    } else { 
     console.log(error); 
    } 
}) 

Это возвращает код состояния 500 для некоторых причина, это неправильно и, следовательно, почему ошибка сервера отправки данных ...

Использование протокола HTTPS

var options = { 
    url: 'https://api.lendingclub.com/api/investor/v1/accounts/' + accountNumber + '/trades/buy/', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json', 
     'Authorization': apiKey 
    } 
    }; 
    var data = JSON.stringify(req.body); 


var req = https.request(options, (res) => { 
console.log(`STATUS: ${res.statusCode}`); 
console.log(`HEADERS: ${JSON.stringify(res.headers)}`); 
res.setEncoding('utf8'); 
res.on('data', (chunk) => { 
console.log(`BODY: ${chunk}`); 
}); 
res.on('end',() => { 
console.log('No more data in response.'); 
}); 
    }); 

req.on('error', (e) => { 
console.log(`problem with request: ${e.message}`); 
}); 


req.write(data); 
req.end(); 

Https попытка вернуть 301 статус по ряду причин ...

Используя одни и те же данные, заголовки и URL-адрес в Почтальон возвращает успешный ответ 200 с данными, мне нужно ...

Я надеваю Не понимаю, как я могу сделать простой HTTP-запрос ...

Обратите внимание: это мой первый проект, работающий с nodejs и угловой, я бы знал, как реализовать что-то вроде этого в php или java легко, но это ошеломляющий меня ..

+0

Вы можете быть лучше использовать что-то вроде 'request' модуля на НОМ, который обрабатывает редиректы для вас (так как вы упомянули получаете код на 301 статусов). Кроме того, вы уверены, что ваше значение заголовка 'Authorization' на самом деле является значением« username: password »base64? – mscdex

+0

Спасибо за ваш комментарий, я считаю, что использую модуль запроса в первой попытке: запрос (параметры, функция (ошибка, ответ, тело) { if (! Error) { // Распечатайте тело ответа // console.log (body) console.log (response.statusCode); res.sendStatus (200); } else { console.войти (ошибка); } Не уверен, закодирован ли его base62, но это требования к API-интерфейсу lendingclub, чтобы установить заголовок как таковой, и он отлично работает на расширении Postman. – BroBan

+0

Попробуйте просто получить API lendC. Можете ли вы ответить на json-ответ и позвонить нормально? Вернитесь к сообщению, и если rc не 500 не забудьте перечислить тело respnse для большего количества detl на err. –

ответ

2

Итак, после многого f messing around и пробовать разные вещи, я наконец нашел решение, которое хорошо работает и делает именно то, что мне нужно, без усложнения вещей:

Использование модуля под названием request-prom - вот что сделал трюк. Вот код, который я использовал для этого:

const request = require('request-promise'); 

const options = { 
    method: 'POST', 
    uri: 'https://requestedAPIsource.com/api', 
    body: req.body, 
    json: true, 
    headers: { 
     'Content-Type': 'application/json', 
     'Authorization': 'bwejjr33333333333' 
    } 
} 

request(options).then(function (response){ 
    res.status(200).json(response); 
}) 
.catch(function (err) { 
    console.log(err); 
}) 
+0

Спасибо @BroBan! :) –

Смежные вопросы