【问题标题】:Ruby Sinatra with multi part post request带有多部分发布请求的 Ruby Sinatra
【发布时间】:2014-05-10 03:44:07
【问题描述】:

不确定这是否是由多部分发布请求引起的问题。 从客户端,我使用 node.js 发送了一个发布请求。帖子正文是一个 JSON 数组

var post_req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('Response: ' + chunk);
    });
  }).on('error',function(){});
post_req.write(data.toString().split("\0").join(""));
post_req.end();

在服务器端(ruby sinatra),我有一个后处理程序,它只打印出 JSON 数组

post '/prediction'  do
puts request.body.read
end

它打印出一个奇怪的不完整的 json 数组,数组前有一个奇怪的字符串“13b2b”。 收到的数据可以在这里找到:https://gist.github.com/wenchaojiang/9880181

我确定我发送的数据是一个有效的 JSON 数组,为什么 sinatra 不能完全接收它,奇怪的“13b2b”是从哪里来的?有什么想法吗?

-----------编辑 -------------

样本数据非常庞大。在这里能找到它: https://gist.github.com/wenchaojiang/9881235

另一个奇怪的是,当我使用以下node.js服务器时,json可以正确接收

http.createServer(function (req, res) {
if (req.method == "POST") {
    var queryData = "";
    req.on('data', function(data) {
        queryData += data;
    });

    req.on('end', function() {
       var obj = JSON.parse(queryData);

       console.log(JSON.parse(queryData).payload);

       res.writeHead(200, "OK", {'Content-Type': 'text/plain'});
       res.end();
    });
}   
}).listen(3001, '0.0.0.0');

-----------------编辑 ----------------------------

即使我只从 node.js 端发送一次,Sinatra 似乎也会收到 2 个发布请求。服务器从第一个请求和第二个post请求接收到上面提到的不完整的json导致以下错误

!! Invalid request
Invalid HTTP format, parsing fails.
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/request.rb:82:in `execute'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/request.rb:82:in `parse'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/connection.rb:39:in `receive_data'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run_machine'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/backends/base.rb:63:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/server.rb:159:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/handler/thin.rb:13:in `run'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/server.rb:265:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/server.rb:137:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/bin/rackup:4:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rackup:19:in `load'
/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rackup:19:in `<main>'

【问题讨论】:

  • 看起来你的有效 JSON 已经很奇怪了,.split 和即时.join 怎么样,所以我猜这就是问题所在。你能给我们举个例子data吗?
  • @Tim 我编辑了问题
  • 哦,有趣。 Ruby 方面是否总是只获得第一个要点中的内容,或者 Ruby 接收的数据量是否有所不同?
  • 您也可以尝试添加一些不错的 http 标头、内容类型等。

标签: ruby node.js http sinatra


【解决方案1】:

我认为(尽管我无法准确重现您所看到的内容)这是由于瘦服务器未处理 chunked transfer encoded 请求。 Node 将文件分成几个部分并尝试分别发送每个块。奇怪的字符串 (13b2b) 是第一个块大小的十六进制值(尽管它实际上与 Gist 中的数据不匹配)并且它被切断,因为客户端希望稍后发送其余部分。

Node 服务器正常工作是因为它可以正确处理分块请求,而 Sinatra 看到的其他(格式错误的)请求是以下分块。

您可以尝试在您的 Sinatra 应用程序中使用另一台服务器,看看它是否有效。 Webrick 似乎还可以:

set :server, 'webrick'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多