2017-02-10 2 views
0

Я хотел бы отправить HTTPS POST с одного узла сервера JS на другой. У меня есть некоторые данные JSON, которые я бы хотел отправить с этим запросом (заполненный формой html).nodeJS - запрос HTTPS, отправка данных JSON

Как это сделать? Я знаю https.request(), но, похоже, нет возможности включить JSON в качестве части запроса. Из моих исследований это кажется возможным с запросом HTTP, но не с запросом HTTPS. Как я могу это решить?

const pug = require('pug'); 
var cloudinary = require('cloudinary'); 
var express = require('express'); 
var multer = require('multer'); 
var upload = multer({ dest: 'uploads/' }); 
var request = require('request'); 
var bodyParser = require('body-parser'); 

var options = { 
hostname: 'ec2-54-202-139-197.us-west-2.compute.amazonaws.com', 
port: 443, 
path: '/', 
method: 'GET' 
}; 

var app = express(); 
var parser = bodyParser.raw(); 
app.use(parser); 

app.set('view engine', 'pug'); 

app.get('/', upload.single('avatar'), function(req, res) { 
return res.render('index.pug'); 
}); 

app.get('/makeRequest*', function(req, res) { 
query = req['query']; 
/* 
Here, I would like to send the contents of the query variable as JSON to the server specified in options. 
*/ 
}); 

ответ

2

Вы можете отправить данные в формате JSON через запрос POST HTTP с модулем родного HTTPS узла, так как stated in the documentation

Все варианты от http.request() являются действительными.

Таким образом, беря пример http.request() вы можете сделать следующее:

var postData = querystring.stringify({ 
    'msg' : 'Hello World!' 
}); 

var options = { 
    hostname: 'www.google.com', 
    port: 80, 
    path: '/upload', 
    method: 'POST', 
    headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Content-Length': Buffer.byteLength(postData) 
} 
}; 

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}`); 
}); 

// write data to request body 
req.write(postData); 
req.end(); 

Вы должны редактировать postData до нужного объекта JSON

+0

Это не работает, сервер не получает postData. –

+0

Я пробовал, и он действительно работает, имейте в виду, что на сервере, где вы будете обрабатывать запрос, данные будут включены в 'req.body', если это сервер узлов –

0

Я считаю, что ниже, что вы хотите , Использование библиотеки request. См. Комментарии в коде для моих рекомендаций.

... 

var options = { 
    hostname: 'ec2-54-202-139-197.us-west-2.compute.amazonaws.com', 
    port: 443, 
    path: '/', 
    method: 'POST', 
    json: true 
}; 

... 

//making a post request and sending up your query is better then putting it in the query string 
app.post('/makeRequest', function(req, res) { 
    var query = req.body['query']; 

    //NOTE, you cannot use a GET request to send JSON. You'll need to use a POST request. 
    //(you may need to make changes on your other servers) 
    options.body = { payload: query }; 
    request(options, function(err, response, body) { 
    if (err) { 
     //Handle error 
     return; 
    } 

    if (response.statusCode == 200) { 
     console.log('contents received'); 
    } 

    }); 
}); 
Смежные вопросы