【发布时间】: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 标头、内容类型等。