2015-07-24 2 views
2

Я использую Node.js, и мне нужно отправить запрос POST, содержащий конкретные данные, на внешний сервер. Я делаю то же самое с GET, но это намного проще, так как мне не нужно включать дополнительные данные. Итак, мой запрос рабочий GET выглядит следующим образом:Node.js https.post request

var options = { 
    hostname: 'internetofthings.ibmcloud.com', 
    port: 443, 
    path: '/api/devices', 
    method: 'GET', 
    auth: username + ':' + password 
}; 
https.request(options, function(response) { 
    ... 
}); 

Так мне было интересно, как сделать то же самое с запросом POST, включая данные, такие как:

type: deviceType, 
id: deviceId, 
metadata: { 
    address: { 
     number: deviceNumber, 
     street: deviceStreet 
    } 
} 

Может кто-нибудь сказать мне, как включить этот данных к вышеперечисленным параметрам? Заранее спасибо!

ответ

4

В объекте параметров вы включаете параметры запроса, как и в запросе GET, и вы создаете еще один объект, содержащий данные, которые вы хотите получить в теле POST. Вы подчеркиваете это, используя функцию querystring (которую вы должны установить на npm install querystring), а затем пересылаете ее с помощью методов write() и end() https.request().

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

'Content-Type': 'application/x-www-form-urlencoded', 
'Content-Length': postBody.length 

так что вам, вероятно, нужно инициализировать ваши варианты объекта после того, как querystring.stringify вернулся. В противном случае вы не будете знать длину строковых данных тела.

var querystring = require('querystring') 
var https = require('https') 


postData = { //the POST request's body data 
    type: deviceType, 
    id: deviceId, 
    metadata: { 
     address: { 
     number: deviceNumber, 
     street: deviceStreet 
     } 
    }    
}; 

postBody = querystring.stringify(postData); 
//init your options object after you call querystring.stringify because you need 
// the return string for the 'content length' header 

options = { 
    //your options which have to include the two headers 
    headers : { 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'Content-Length': postBody.length 
    } 
}; 


var postreq = https.request(options, function (res) { 
     //Handle the response 
}); 
postreq.write(postBody); 
postreq.end(); 
Смежные вопросы