2011-11-24 268 views
7
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); 
}); 

當我運行上面的代碼時,我得到下面的錯誤。如何在NodeJS中發送POST請求時設置Content-Length?

錯誤消息:

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 

如何修復的Abobe錯誤?
我曾嘗試做以下

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} 

但如果我嘗試這樣我得到以下錯誤:

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

任何人可以幫助我在這?

感謝
KOTI

PS:如果我進入了整個網址到瀏覽器地址欄,然後回車我得到JSON響應預期。

+2

請不要使用data.length,我碰到這個問題,作者說不要使用data.length,而應該使用Buffer.byteLength(data)。參考問題:http://stackoverflow.com/questions/18692580/node-js-post-causes-error-socket-hang-up-code-econnreset和ref問題:https://github.com/visionmedia/express/問題/ 1749 –

回答

-3

我能夠通過改變從POST方法來解決這個問題GET

感謝 KOTI

+0

你仍然面臨這個問題?它是否修復?您正在使用哪個版本的節點?我面臨同樣的問題。它看起來像節點的問題。你找到什麼了嗎? – Somnath

+2

您的問題是關於POST請求,所以更改爲GET請求不是答案。 – Atrahasis

6

事實證明,解決給定的問題,當你要打POST請求,顯然是將選項對象的「標題」字段設置爲包含「內容長度」字段。

在這裏看到代碼:

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

+1

但是,您如何找到放在內容長度字段上的正確值?我有一個json響應,並且我得到一個'ERR_CONTENT_LENGTH_MISMATCH'錯誤。不知道如何將它設置爲正確的值來停止發生此錯誤。 –

+1

@UlyssesAlves你應該能夠將它設置爲代表JSON的字符串的長度。這不適合你嗎? –

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

}); 
3

我以爲你失蹤了兩兩件事。 假設p既是您的端點和您的網址編碼的有效負載

您可以在結束請求之前將您的p變量拆分爲您需要寫入的api路徑和post_data負載。

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

希望它有幫助!