12
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.

ekanna
  • 5,462
  • 8
  • 28
  • 31
  • 2
    please do not use data.length, I bumped to this issue and author said do not use data.length, instead, use Buffer.byteLength(data). Ref question: http://stackoverflow.com/questions/18692580/node-js-post-causes-error-socket-hang-up-code-econnreset and ref issue: https://github.com/visionmedia/express/issues/1749 – Nam Nguyen Sep 09 '13 at 07:38

4 Answers4

8

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?

Community
  • 1
  • 1
John Clements
  • 16,895
  • 3
  • 37
  • 52
  • 1
    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. – Ulysses Alves Apr 08 '17 at 23:29
  • 1
    @UlyssesAlves you should just be able to set it to the length of the string representing the JSON. Is that not working for you? – John Clements Apr 09 '17 at 23:35
5

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

gtrenco
  • 365
  • 3
  • 8
2
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();
    });  

});
madz
  • 168
  • 2
  • 11
-6

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

Thanks koti

ekanna
  • 5,462
  • 8
  • 28
  • 31
  • 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? – Somnath Feb 20 '14 at 05:31
  • 4
    Your question was about POST requests, so changing to GET requests is not an answer. – Mouloud85 Jul 23 '16 at 13:16