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

47,665

Solution 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?

Solution 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!!

Solution 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();
    });  

});
Share:
47,665
ekanna
Author by

ekanna

@ekanna

Updated on July 09, 2022

Comments

  • ekanna
    ekanna almost 2 years
    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.

  • Somnath
    Somnath about 10 years
    are you still facing this issue? Is it fixed? Which version of node you are using? I'm facing the same issue. Its looking like issue with node. Have you found anything?
  • Mouloud85
    Mouloud85 almost 8 years
    Your question was about POST requests, so changing to GET requests is not an answer.
  • Ulysses Alves
    Ulysses Alves about 7 years
    But how do you find out the right value to put on the content-length field? I have a json response, and I'm getting an ERR_CONTENT_LENGTH_MISMATCH error. Wonder how I can set it to the right value to stop getting this error.
  • John Clements
    John Clements about 7 years
    @UlyssesAlves you should just be able to set it to the length of the string representing the JSON. Is that not working for you?
  • Muhammad Umer
    Muhammad Umer almost 5 years
    length is suppose to be in bytes not number of characters