NodeJSでPOST要求を送信するときにContent-Lengthを設定する方法は?

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

私は上記のコードを実行すると、私は以下のエラーが発生しています。

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  

異常なエラーを修正するにはどうすればいいですか?
私は以下をやってみた

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' }  

誰も私にこれを助けることができますか?

ありがとう コティ

PS:ブラウザーのアドレスバーにURL全体を入力してEnterキーを押すと、期待どおりのJSON応答が得られます。

7
data.lengthを使用しないでください。私はこの問題にぶつかり、著者はdata.lengthを使用せず、代わりにBuffer.byteLength(data)を使用します。参照質問: github.com/visionmedia/express/issues/1749
追加された 著者 Nam Nguyen,

4 答え

あなたが行うときに、問題の解決策は、明らかにオプションオブジェクトの "headers"フィールドに 'Content-Length'フィールドを含めるように設定していることが分かります。

ここのコードを参照してください:

node.jsでHTTP POST要求を行う方法

6
追加された
@UlyssesAlvesではJSONを表す文字列の長さに設定できるだけです。それはあなたのために働いていないのですか?
追加された 著者 John Clements,
しかし、どのようにしてコンテンツ長のフィールドに入れるのが正しい価値を見出していますか?私はjsonレスポンスを持っており、 ERR_CONTENT_LENGTH_MISMATCH エラーが発生します。このエラーの発生を止めるには、どのように適切な値に設定するのがいいかと思います。
追加された 著者 Ulysses Alves,

私はあなたが2つのものを欠いていると思う。 エンド URLエンコードされたペイロードの両方が 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();  

それが役に立てば幸い!!

4
追加された

私はPOSTからGETにメソッドを変更することでこの問題を解決することができます

ありがとう コティ

3
追加された
あなたの質問はPOSTリクエストに関するものだったので、GETリクエストへの変更は答えではありません。
追加された 著者 Atrahasis,
あなたはまだこの問題に直面していますか?それは修正されていますか?どのノードのバージョンを使用していますか?私は同じ問題に直面しています。そのノードの問題のように見える。何か見つけましたか?
追加された 著者 Somnath,
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();
    });  

});
2
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript