How to set Content-Length when sending POST request in NodeJS?

偶尔善良 提交于 2020-08-21 11:28:30

问题


var https = require('https');  

var p = '/api/username/FA/AA?ZOHO_ACTION=EXPORT&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_KEY=dummy1234&ticket=dummy9876&ZOHO_API_VERSION=1.0';  

var https = require('https');  
var options = {  
  host: 'reportsapi.zoho.com',  
  port: 443,  
  path: p,  
  method: 'POST'  
};  

var req = https.request(options, function(res) {  
  console.log("statusCode: ", res.statusCode);  
  console.log("headers: ", res.headers);  
  res.on('data', function(d) {  
    process.stdout.write(d);  
  });  
});  
req.end();  

req.on('error', function(e) {  
  console.error(e);  
});  

When i run the above code i am getting below error.

error message:

statusCode:  411  
headers:  { 'content-type': 'text/html',  
  'content-length': '357',  
  connection: 'close',  
  date: 'Thu, 24 Nov 2011 19:58:51 GMT',  
  server: 'ZGS',  
  'strict-transport-security': 'max-age=604800' }  
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  


411 - Length Required  

How to fix the abobe error?
I have tried doing below

var qs =   'ZOHO_ACTION=EXPORT&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_KEY=dummy1234&ticket=dummy9876&ZOHO_API_VERSION=1.0';
'   
options.headers = {'Content-Length': qs.length}  

But if I try this way I am getting below error:

{ stack: [Getter/Setter],  
  arguments: undefined,  
  type: undefined,  
  message: 'socket hang up' }  

Can anybody help me on this?

Thanks
koti

PS:If I enter the whole url into browser address bar and hit enter I am getting JSON response as expected.


回答1:


It turns out that the solution to the given problem, when you do want to make a POST request, is apparently to set the "headers" field of the options object to contain a 'Content-Length' field.

See code here:

How to make an HTTP POST request in node.js?




回答2:


i think you're missing two things. Assuming p is both your endpoint and your url-encoded payload.

You could split your p variable into the both api path, and the post_data payload you need to write before ending the request.

var p = 'ZOHO_ACTION=EXPORT&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_KEY=dummy1234&ticket=dummy9876&ZOHO_API_VERSION=1.0';

var https = require('https');  
var options = {  
  host: 'reportsapi.zoho.com',  
  port: 443,  
  path: '/api/username/FA/AA',  
  method: 'POST',
  headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': Buffer.byteLength(p)
  } 
}
var req = https.request(options, function(res) {  
  console.log("statusCode: ", res.statusCode);  
  console.log("headers: ", res.headers);  
  res.on('data', function(d) {  
    process.stdout.write(d);  
  });  
});
req.write(p);  
req.end();  

Hope it helps!!




回答3:


var server = http.createServer();
server.on('request', function(req, res) {

    req.on('data',function(data){

        res.writeHead(200, {'Content-Type': 'text/plain','Content-Length':data.toString().length+''});
        res.write(data.toString());
        res.end();
    });  

});



回答4:


I am able to solve this problem by changing the method from POST to GET

Thanks koti



来源:https://stackoverflow.com/questions/8262410/how-to-set-content-length-when-sending-post-request-in-nodejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!