如何在nodejs中发出此请求(状态415)?

时间:2015-11-18 10:51:12

标签: node.js bash curl request node-request

我正在使用bash来完成一项任务。在尝试解析响应时遇到了一些麻烦。现在我正在使用nodejs来完成任务。但我得到以下错误:

"httpStatus" : 415,
"messages" : [ {
    "errorCode" : "305",
    "message" : "Unsupported media type 'application/x-www-form-urlencoded'"
} ]

这曾经是我在bash文件中的curl请求:

 curl --include\                      
     --request POST \                 
     --user "$USERNAME:$PASSWORD" \           
     --header "Content-Type: application/vnd.profitbricks.resource+json" \ 
     --data-binary "{             
         \"properties\": {           
             \"name\": \"$servername\",      
             \"ram\": $RAM,
             \"cores\": $CORES     
         }  
     }" \                      
     https://api.profitbricks.com/rest/datacenters/$ID/servers ;  

这是我目前的要求:

var request = require('request');
var reqoptions = {                 
  method: 'POST',             
  uri: 'https://api.profitbricks.com/rest/datacenters/'+options.vdcID+'/servers',
  form:{
     "properties":{
        "cores": options.cores,
        "ram": options.ramsize,
        "name": options.servername 
     }
  },
  headers: {               
      'Authorization': 'Basic ' + new Buffer(options.user+':'+options.password).toString('base64'),
      'Content-Type': 'application/vnd.profitbricks.resource+json'
   }
};   

request(reqoptions, function(err, res, body){});

2 个答案:

答案 0 :(得分:1)

form选项将内容类型更改为form-urlencoded

您不应在请求选项

中使用form

发送二进制数据,例如nodejs/express and binary data in POST

因此请使用body: myBuffer代替form: {...}

答案 1 :(得分:1)

问题是序列化。我把对象字符串化了。现在它有效。

var request = require('request');
var body = {
     "properties":{
        "cores": options.cores,
        "ram": options.ramsize,
        "name": options.servername 
     }
  }
var reqoptions = {                 
  method: 'POST',             
  uri: 'https://api.profitbricks.com/rest/datacenters/'+options.vdcID+'/servers',
  body: JSON.stringify(body),
  headers: {               
      'Authorization': 'Basic ' + new Buffer(options.user+':'+options.password).toString('base64'),
      'Content-Type': 'application/vnd.profitbricks.resource+json'
   }
};   

request(reqoptions, function(err, res, body){});

这就是诀窍。