【问题标题】:How to set Content-Length when sending POST request in NodeJS?在 NodeJS 中发送 POST 请求时如何设置 Content-Length?
【发布时间】:2012-01-05 22:31:39
【问题描述】:
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);  
});  

当我运行上面的代码时,我遇到了错误。

错误信息:

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

有人可以帮我解决这个问题吗?

谢谢
科蒂

PS:如果我将整个 url 输入浏览器地址栏并按回车键,我会得到预期的 JSON 响应。

【问题讨论】:

标签: javascript post node.js request content-length


【解决方案1】:

事实证明,当您确实想要发出 POST 请求时,给定问题的解决方案显然是将选项对象的“headers”字段设置为包含“Content-长度”字段。

在此处查看代码:

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

【讨论】:

  • 但是你如何找到正确的值放在内容长度字段上呢?我有一个 json 响应,我收到一个 ERR_CONTENT_LENGTH_MISMATCH 错误。想知道如何将其设置为正确的值以停止出现此错误。
  • @UlyssesAlves 您应该能够将其设置为表示 JSON 的字符串的长度。这不适合你吗?
【解决方案2】:

我认为您缺少两件事。 假设 p 既是您的 endpoint 也是您的 url 编码的有效负载。

您可以将您的 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();  

希望对你有帮助!

【讨论】:

    【解决方案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】:

    我可以通过将方法从 POST 更改为 GET 来解决这个问题

    谢谢 科蒂

    【讨论】:

    • 你还在面对这个问题吗?是固定的吗?您使用的是哪个版本的节点?我面临同样的问题。它看起来像节点的问题。你有什么发现吗?
    • 您的问题是关于 POST 请求,因此更改为 GET 请求不是答案。
    猜你喜欢
    • 2019-10-06
    • 2016-08-21
    • 2020-02-05
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多