【问题标题】:Negotiate maximum request body size with remote server before sending a POST在发送 POST 之前与远程服务器协商最大请求正文大小
【发布时间】:2018-11-10 19:37:37
【问题描述】:

我有一个 Node JS 服务器,它正在将不确定大小的 JSON 对象发送到远程服务器,该远程服务器可能无法提前知道主体请求大小的限制。

如果我的 JSON 对象超过最大请求大小,我想分块发送数据。

我正在测试远程服务器的模拟实现,它使用 npm 库 body-parser 来设置其最大请求正文大小。当我发送超过此限制的请求时,模拟远程服务器返回错误:PayloadTooLargeError: request entity too large

问题:有没有办法通过标准 HTTP 方法和标头确定服务器接受的最大请求正文大小?

【问题讨论】:

    标签: node.js rest http httprequest


    【解决方案1】:

    我认为您无法通过查询远程服务器来直接获取它的最大值。

    您最好的选择可能是尝试“检查并查看”方法,从一个合理的值开始,然后通过在每次被 413 拒绝时按一定比例减少它来切换到分块。

    我猜 8mb-10mb 是一般互联网服务器的一个很好的起始大小。但是在您的特定应用程序中,您可能会知道一些额外的限制,即它要连接的服务器类型以及您尝试发送的数据的典型大小,因此您可以使用更大的默认值。

    我不确定我是否会推荐它,但这是一个愚蠢的脚本,它向 google.com 的最大大小为 4096 字节的二进制搜索发送一堆虚拟请求。

    var http = require('http');
    var querystring = require('querystring');
    
    function compute_size(domain) {
      var max_size = 10240;
      var min_size = 0;
    
      function send_req(size) {
        var post_data = '*'.repeat(size)
        var post_options = {
          host: domain,
          port: '80',
          path: '/',
          method: 'POST',
          headers: {
            'Content-Length': size
          }
        };
    
        var req = http.request(post_options, function(res) {
          console.log('Try for size ' + size + ': ' + res.statusCode);
          var fn;
    
          if (res.statusCode == 413) {
            max_size = size;
            fn = Math.floor;
          } else {
            min_size = size;
            fn = Math.ceil;
          }
    
          var next_size = fn((max_size - min_size)/2+min_size);
    
          if (next_size == max_size || next_size == min_size) {
            console.log('Found max: ', min_size);
          } else {
            send_req(next_size);
          }
        });
    
        req.write(post_data);
        req.end();
    
      }
    
      send_req(max_size);
    }
    
    compute_size('google.com');
    

    这是 google.com 的输出,减去 4096 的最大值...哈哈

    $ node post.js
    Try for size 10240: 413
    Try for size 5120: 413
    Try for size 2560: 405
    Try for size 3840: 405
    Try for size 4480: 413
    Try for size 4160: 413
    Try for size 4000: 405
    Try for size 4080: 405
    Try for size 4120: 413
    Try for size 4100: 413
    Try for size 4090: 405
    Try for size 4095: 405
    Try for size 4098: 413
    Try for size 4096: 405
    Try for size 4097: 413
    Found max:  4096
    

    【讨论】:

    • 听起来我们将不得不提前口头确定托管此远程服务器的业务客户端的限制。出于开发目的,我将使用您从 google.com 获得的最大值。非常感谢,这是找到最大尺寸的好方法。
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多